【发布时间】:2017-05-25 17:25:23
【问题描述】:
我想表演:
for i in list_a:
for j in list_b[i]:
print(i, j)
是否可以使用 itertools 来做到这一点? 我正在寻找类似的东西:
for i, j in itertools.product(list_a, list_b[i])
我想这样做是为了速度和可读性。
【问题讨论】:
-
我认为不可能以任何提高速度或可读性的方式将其展平。在我看来,嵌套方法是最自然且最有效的方法。您可以通过将其编写为列表推导式或生成器表达式将其全部写在一个物理行上,例如:
[ call_some_function(i,j) for i in list_a for j in list_b[i] ],但这基本上仍然是一个嵌套的 for 循环。 -
好的,但是最快的方法是什么,编写一个列表推导式并使用函数对其进行迭代,或者创建一个产生某些内容并对其进行迭代的函数?
-
如果你想要一个列表,使用列表推导。如果你想要一个生成器,请使用生成器表达式:
stuff = (call_some_function(i, j) for i in list_a for j in list_b[i])然后你可以在不浪费内存的情况下懒惰地迭代它:for thing in stuff: do_some_more_stuff(thing) -
不过,纯 for 循环方法可能比使用生成器表达式更快。但是列表推导可能比等效的 for 循环稍快。
-
非常感谢您的帮助
标签: python for-loop nested-loops