【发布时间】:2023-02-19 03:47:11
【问题描述】:
如何从一组列表中获取笛卡尔积(所有可能的值组合)?
例如,给定
somelists = [
[1, 2, 3],
['a', 'b'],
[4, 5]
]
我怎么得到这个?
[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4), (2, 'a', 5), ...]
这种技术的一个常见应用是避免深度嵌套循环。有关更具体的副本,请参阅Avoiding nested for loops。
如果你想要笛卡尔积相同多次列出自身,itertools.product 可以优雅地处理。见Operation on every pair of element in a list或Generating permutations with repetitions。
许多已经知道 itertools.product 的人都在为每个输入序列期望单独的参数而不是例如列表的列表。接受的答案显示了如何使用 * 处理此问题。但是,这里使用* 解压参数是根本上没有什么不同从任何其他时间它在函数调用中使用。请参阅本主题的Expanding tuples into arguments(并酌情使用它来关闭重复的问题)。
【问题讨论】:
-
请注意,“每个可能的组合”与“笛卡尔积”并不完全相同,因为在笛卡尔积中,允许重复。
-
是否有笛卡尔积的非重复版本?
-
@KJW 是的,
set(cartesian product) -
笛卡尔积中不应有重复项,除非输入列表本身包含重复项。如果您不希望笛卡尔积中出现重复项,请在所有输入列表中使用
set(inputlist)。不在结果上。 -
在数学上,笛卡尔积是一个集合,所以笛卡尔积是不是包含重复项。另一方面,如果输入有重复,
itertools.product将在输出中有重复。所以itertools.product严格来说不是笛卡尔积,除非你将输入包装在set中,如@CamilB 所述。
标签: python list cartesian-product