扫码关注官方订阅号
想写这样一个逻辑
for i in lit: for j in lit: do_something(i, j)
但是感觉这样写好丑,有没有比较优美的写法?
小伙看你根骨奇佳,潜力无限,来学PHP伐。
用 itertools 的笛卡尔积
itertools
from itertools import product for i, j in product(lit, lit): do_something(i, j)
product 返回一个生成器,能 yield 出传入数组形成的笛卡尔积。product 可以接受任意多个数组。
product
yield
我来补上一刀:
# coding=utf-8 def unique_pairs(n): """一个贱贱的生成器""" for i in n: for j in n: yield i, j lit = "hey!" for i, j in unique_pairs(lit): print(i, j)
unique_pairs接收一个可迭代的对象, 返回一个生成器, 能输出接收迭代对象所有迭代元素可能的笛卡尔积本质上还是双重循环, 但是自我感觉良好, 可复用
unique_pairs
代码输出:
('h', 'h') ('h', 'e') ('h', 'y') ('h', '!') ('e', 'h') ('e', 'e') ('e', 'y') ('e', '!') ('y', 'h') ('y', 'e') ('y', 'y') ('y', '!') ('!', 'h') ('!', 'e') ('!', 'y') ('!', '!')
最近刷了一道leetcode的题目【two sum】,感觉思路很好哇,也和循环有关系。Giver numers=[2, 7, 11, 15],target=9, because 2+7=9, then return indexs [0,1].刚开始,想用2重循环做的,发现时间超时(时间复杂度太高)然后想一下1重循环也可以搞定的,每次记录下你得到的信息(使用map了),减小了时间复杂度。最好不要用2重循环,感觉好浪费时间哦~
izip 不行?
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
用
itertools的笛卡尔积product返回一个生成器,能yield出传入数组形成的笛卡尔积。product可以接受任意多个数组。我来补上一刀:
unique_pairs接收一个可迭代的对象, 返回一个生成器, 能输出接收迭代对象所有迭代元素可能的笛卡尔积本质上还是双重循环, 但是自我感觉良好, 可复用
代码输出:
最近刷了一道leetcode的题目【two sum】,感觉思路很好哇,也和循环有关系。
Giver numers=[2, 7, 11, 15],target=9, because 2+7=9, then return indexs [0,1].
刚开始,想用2重循环做的,发现时间超时(时间复杂度太高)
然后想一下1重循环也可以搞定的,每次记录下你得到的信息(使用map了),减小了时间复杂度。
最好不要用2重循环,感觉好浪费时间哦~
izip 不行?