有替代的分层嵌套的FOR循环吗?

时间:2019-12-02 04:47:46

标签: python loops for-loop nested

如果嵌套的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表示它..可能是使它变平的函数!!!直到最后一级,因此它返回元组列表,因为这是您在正常情况下通常要做的事情...即用循环方式对数据进行处理

1 个答案:

答案 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)