多个列表的产品-单个列表与列表数组,需要帮助了解

时间:2018-08-04 01:36:32

标签: python set python-2.x product itertools

预警:我是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)]

我的问题是:

  1. 为什么不list(product(array)) == list(product(l1,l2,l3))
  2. 使用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):

1 个答案:

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

来自python documentation

  

如果语法* expression出现在函数调用中,则expression   必须评估为可迭代的。处理此可迭代元素   好像它们是附加的位置论证;如果有   位置参数x1,...,xN和表达式的计算结果为   序列y1,...,yM,这等效于位置为M + N的调用   参数x1,...,xN,y1,...,yM。

由于您必须提到自己在学习, python教程的Unpacking argument lists部分中也对此进行了介绍。