一般来说,迭代未知数量的列表的最佳方法是什么?

时间:2014-01-16 15:52:27

标签: python list iteration

给定一种支持迭代列表的编程语言,即

for element in list do
    ...

如果我们有一个程序将动态数量的列表作为输入,list[1] ... list[n](其中n可以取任何值),迭代这些元素的每个组合的最佳方法是什么列表?

e.g。 list[1] = [1,2]list[2] = [1,3]然后我们遍历[[1,1], [1,3], [2,1], [2,3]]

我认为我的想法非常好:

1)在list_product中创建这些列表的重要产品(例如,在Python中,您可以多次使用itertools.product()),然后迭代list_product。问题是,这需要我们存储(可能是巨大的)可迭代的。

2)找到所有列表长度的乘积,total_length,并使用模块化算术类型的想法,按照以下方式做一些事情。

len_lists = [len(list[i]) for i in [1..n]]
total_length = Product(len_lists)
for i in [1 ... total_length] do
    total = i-1
    list_index = [1...n]
    for j in [n ... 1] do
        list_index[j] = IntegerPartOf(total / Product([1:j-1]))
        total = RemainderOf(total / Product([1:j-1]))
    od
    print list_index
od

然后为所有不同的组合打印list_index

关于速度是否有更好的方法(不要太在意可读性)?

2 个答案:

答案 0 :(得分:5)

  

1)在list_product中创建这些列表的大产品(例如在Python中,您可以多次使用itertools.product()),然后遍历list_product。问题是,这需要我们存储(可能是巨大的)可迭代的。

itertools(以及一般的迭代器)的意思是它们不会立即构造整个结果,而是一次创建一个结果中的术语并从中返回一个术语。因此,如果您有一个列表ListOfLists,并且您希望所有元组都包含每个列表中的一个元素,请使用

for elt in itertools.product(*ListOfLists):
   ...

请注意您只需拨打product一次。这简单而有效。

答案 1 :(得分:2)

您可以使用itertools.product而无需实现列表:

>>> from itertools import product
>>> lol = [[1,2],[1,3]]
>>> product(*lol)
<itertools.product object at 0xaa414b4>
>>> for x in product(*lol):
...     print x
...     
(1, 1)
(1, 3)
(2, 1)
(2, 3)

就性能而言,花费更多时间来考虑优化方法比您希望从优化中获得的更容易。如果你在循环中做任何事情,那么迭代开销本身很可能是微不足道的。 (最常见的例外是一个紧密的数字循环,在这种情况下你应该尝试以numpythonically方式进行。)

我的建议是使用itertools.product继续你的一天。