Product of multiple lists--individual lists vs array of lists,需要帮助理解
Product of multiple lists--individual lists vs array of lists, need help understanding
预警:我是 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):
。
1) Why doesn't list(product(array))=list(product(l1,l2,l3))?
好吧,itertools.product()
接收可迭代对象,然后在其中生成笛卡尔积。因此,当您执行 list(product(array)) 时,您基本上是在尝试获取单个列表(?)的笛卡尔积,并注意在一个列表和空可迭代之间的相同符号笛卡尔积的输出中的逗号。
2) Using array, how can I get the same output as list(product(l1,l2,l3))?
注意你的问题归结为在调用 function.We 时将 arr
列表转换为 *args
有 *
运算符,所以对于答案只是做:
product(*arr)
If the syntax *expression appears in the function call, expression
must evaluate to an iterable. Elements from this iterable are treated
as if they were additional positional arguments; if there are
positional arguments x1, ..., xN, and expression evaluates to a
sequence y1, ..., yM, this is equivalent to a call with M+N positional
arguments x1, ..., xN, y1, ..., yM.
既然你一定要说是自学,
这也包含在 python 教程的标题为 Unpacking argument lists.
的部分中
预警:我是 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):
。
1) Why doesn't list(product(array))=list(product(l1,l2,l3))?
好吧,itertools.product()
接收可迭代对象,然后在其中生成笛卡尔积。因此,当您执行 list(product(array)) 时,您基本上是在尝试获取单个列表(?)的笛卡尔积,并注意在一个列表和空可迭代之间的相同符号笛卡尔积的输出中的逗号。
2) Using array, how can I get the same output as list(product(l1,l2,l3))?
注意你的问题归结为在调用 function.We 时将 arr
列表转换为 *args
有 *
运算符,所以对于答案只是做:
product(*arr)
If the syntax *expression appears in the function call, expression must evaluate to an iterable. Elements from this iterable are treated as if they were additional positional arguments; if there are positional arguments x1, ..., xN, and expression evaluates to a sequence y1, ..., yM, this is equivalent to a call with M+N positional arguments x1, ..., xN, y1, ..., yM.
既然你一定要说是自学, 这也包含在 python 教程的标题为 Unpacking argument lists.
的部分中