首页 > Python如何同时进行两个循环

Python如何同时进行两个循环

想写这样一个逻辑

for i in lit:
    for j in lit:
        do_something(i, j)

但是感觉这样写好丑,有没有比较优美的写法?


我来补上一刀:

# 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')
('!', '!')

itertools 的笛卡尔积

from itertools import product

for i, j in product(lit, lit):
    do_something(i, j)

product 返回一个生成器,能 yield 出传入数组形成的笛卡尔积。
product 可以接受任意多个数组。


最近刷了一道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 不行?

【热门文章】
【热门文章】