预警:我是Python的新手,而且我正在自学,所以这个问题可能只是一个简单的解决方案-非常感谢任何帮助(和耐心)!
好的,总的来说,我想获得可变数量列表的所有可能交集的并集。我不太确定如何解释我遇到的一般问题,因此,出于这个问题的考虑,我将仅使用一个包含3个列表的示例(但同样,列表的实际数量会有所不同) :
假设我们有以下内容:
>>>from itertools import product
>>>l1=[1,2,3]
>>>l2=[1,4,5]
>>>l3=[1,6,7]
>>>
>>>array=[l1,l2,l3]
>>>
>>>
>>>list(product(array))
[([1, 2, 3],), ([1, 4, 5],), ([1, 6, 7],)]
>>>
>>>list(product(l1,l2,l3)
[(1, 1, 1), (1, 1, 6), (1, 1, 7), (1, 4, 1), (1, 4, 6), (1, 4, 7), (1, 5, 1), (1, 5, 6), (1, 5, 7), (2, 1, 1), (2, 1, 6), (2, 1, 7), (2, 4, 1), (2, 4, 6), (2, 4, 7), (2, 5, 1), (2, 5, 6), (2, 5, 7), (3, 1, 1), (3, 1, 6), (3, 1, 7), (3, 4, 1), (3, 4, 6), (3, 4, 7), (3, 5, 1), (3, 5, 6), (3, 5, 7)]
我的问题是:
list(product(array)) == list(product(l1,l2,l3))
?array
,我如何获得与list(product(l1,l2,l3))
相同的输出?更多背景信息:
最终,目标是获得列表交集的所有可能组合的并集。即;
1>>>for x in product(l1,l2,l3):
... newArray.append(reduce(set.intersection, [set(e) for e in array])
2>>>u=reduce(set.union, [set(e) for e in newArray])
3>>>u
set([1])
除了,因为我不知道会有多少个列表(在我的代码中,它们被循环附加到array
上),所以我希望行1
成为某些东西例如for x in product(array):
,而不是for x in product(l1,l2,l3):
。
答案 0 :(得分:0)
1)为什么不列出(product(array))= list(product(l1,l2,l3))?
那么itertools.product()
会吸收可迭代变量,然后在其中生成笛卡尔乘积。因此,当您执行list(product(array))时,您基本上是在尝试获取单个list(?)的笛卡尔积,并注意在一个列表和空的Iterable之间相同的笛卡尔积的输出中的逗号。
2)使用数组,如何获得与list(product(l1,l2,l3))相同的输出?
请注意,您的问题归结为在调用函数时将arr
列表转换为*args
。为此,我们有*
运算符,因此,答案是: / p>
product(*arr)
如果语法* expression出现在函数调用中,则expression 必须评估为可迭代的。处理此可迭代元素 好像它们是附加的位置论证;如果有 位置参数x1,...,xN和表达式的计算结果为 序列y1,...,yM,这等效于位置为M + N的调用 参数x1,...,xN,y1,...,yM。
由于您必须提到自己在学习, python教程的Unpacking argument lists部分中也对此进行了介绍。