如果嵌套的FOR循环未互连,则可以使用itertools.product()替换它们。
for x, y in product(range(20), range(17)): ....
问题是,对于分层嵌套的FOR循环..f.e,是否有相同的方法。可以说我有一个列表列表:
for level2 in LoL :
for level3 in level2 :
for level4 in level3 :
.....
t1, t2,..,tn = levelM
LoL结构可能是这样的,只是一个例子:
[[[1, 9], [1, 6], [1, 8], [1, 6], [1, 2]],
[[5, 8], [5, 11], [5, 14], [5, 6], [5, 11]],
[[7, 12], [7, 13], [7, 10], [7, 9], [7, 12]],
[[22, 25], [22, 30], [22, 25], [22, 26], [22, 26]],
[[55, 57], [55, 55], [55, 55], [55, 56], [55, 61]]]
输出无所谓,我想知道是否有像product()这样的快捷功能/结构
我唯一看到的另一种方法是递归,但这更加复杂。
product()隐藏了结构...现在@RaySteam表示它..可能是使它变平的函数!!!直到最后一级,因此它返回元组列表,因为这是您在正常情况下通常要做的事情...即用循环方式对数据进行处理
答案 0 :(得分:0)
嵌套循环是一种将“扁平化”应用程序隐藏到多级数据结构的方法,因此,此模式的捷径是对扁平化列表的结果进行操作。
重点是,Python当前(可能也在将来)缺少用于任意嵌套列表的扁平函数。此thread和此post中的更多信息。
另外,您不希望在处理最里面的线对时将结构完全展平。
这是我针对此特定用例编写的一些代码:
from itertools import chain
# Flattens i times.
# You need to know how much you need to flatten
# Assumes that nesting level doesn't vary.
def almost_flat(lol, i):
x = lol
for _ in range(i):
x = chain.from_iterable(x)
return x
# Flattens until it obtains a list-of-lists
# Also relies on fixed nesting structure.
# implemented recursively although you may unroll it in tail recursive manner.
def flat(ls):
if not isinstance(ls[0][0], list, tuple):
return ls
else:
out = []
for x in ls:
out.extend(x)
return flat(out)