给定一种支持迭代列表的编程语言,即
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
。
关于速度是否有更好的方法(不要太在意可读性)?
答案 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
继续你的一天。