想写这样一个逻辑
for i in lit:
for j in lit:
do_something(i, j)
但是感觉这样写好丑,有没有比较优美的写法?
用
itertools
的笛卡尔积
from itertools import product
for i, j in product(lit, lit):
do_something(i, j)
product
返回一个生成器,能
yield
出传入数组形成的笛卡尔积。
product
可以接受任意多个数组。
我来补上一刀:
# 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
接收一个可迭代的对象, 返回一个生成器, 能输出接收迭代对象所有迭代元素可能的笛卡尔积
本质上还是双重循环, 但是自我感觉良好, 可复用
代码输出:
('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 不行?