多个列表的产品-单个列表与列表数组,需要帮助理解[重复]

Posted

技术标签:

【中文标题】多个列表的产品-单个列表与列表数组,需要帮助理解[重复]【英文标题】:Product of multiple lists--individual lists vs array of lists, need help understanding [duplicate] 【发布时间】:2018-08-04 01:36:31 【问题描述】:

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

【问题讨论】:

你只想在这里product(*array)。您是否了解“splat 语法”,将可迭代作为一组单独的参数粘贴到函数调用中,还是需要解释的链接? 如果你好奇为什么product(array)(甚至product())尽管没用却是合法的:首先,在数学上,你可以写product_n=1_to_1(n)。更重要的是,这意味着你可以写product(*rows),即使rows 是某个可能只有一行或没有的调用者传递给你的值,你也可以写product(array, repeat=power),即使power 可能是只有 1 或 0。 @abarnert:谢谢,product(*array) 工作!此外,“splat 语法”的解释链接也会有所帮助! 【参考方案1】:

1) 为什么不列出(product(array))=list(product(l1,l2,l3))?

itertools.product() 接收可迭代对象,然后在其中生成笛卡尔积。因此,当您执行 list(product(array)) 时,您基本上是在尝试获取单个 list(?) 的笛卡尔积,并注意一个列表和空可迭代对象之间的相同表示笛卡尔积的输出中的逗号。

2) 使用数组,如何获得与 list(product(l1,l2,l3)) 相同的输出?

请注意,您的问题归结为在调用函数时将arr 列表转换为*args。我们为此使用了* 运算符,因此只需执行以下操作:

product(*arr)

来自python documentation:

如果函数调用中出现语法 *expression,则表达式 必须评估为可迭代。来自这个可迭代的元素被处理 好像它们是额外的位置参数;如果有 位置参数 x1, ..., xN 和表达式的计算结果为 序列 y1, ..., yM,这相当于一个 M+N 位置的调用 参数 x1, ..., xN, y1, ..., yM。

既然你必须提到你是在自学, 这也包含在 Python 教程中,标题为 Unpacking argument lists 的部分。

【讨论】:

非常感谢!我会看看。我真的很感激。

以上是关于多个列表的产品-单个列表与列表数组,需要帮助理解[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从列表视图按钮单击将多个数据添加到数组列表?

通过将单个查询图像与多个图像的列表匹配来存储关键点索引

如何创建多个从同一个数组中获取值的动态下拉列表,而无需更改 Javascript 中的其他下拉列表

[引用数组的多个值时,使用Python列表理解排除重复项

将资产列表(数组)保存到特定的 CKRecord

如何将对象列表或数组传递到旨在更新单个对象的 GraphQL 突变中?