我该如何从一组列表中获得笛卡尔积(每个值的所有可能组合)?
例如,给定:
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), ...]
这种技术的一个常见应用是避免嵌套循环。有关更具体的情况,请参见避免嵌套for循环 。同样,该技术可能用于“展开”具有列表值的字典;请参见将Python字典排列组合成字典列表。
如果您想要同一列表的笛卡尔积,可以使用itertools.product
来处理。请参见在列表中每对元素上操作或如何从列表中获取“带重复的排列”(列表本身的笛卡尔积)?。
许多已经了解itertools.product
的人都很难处理它期望每个输入序列都作为单独的参数传递的事实,而不是例如一个列表的列表。 接受的答案显示了如何使用*
处理此问题。然而,在函数调用中使用*
来解包参数从根本上并没有不同于在任何其他时间使用它。有关此主题,请参见将元组扩展为参数 (并根据需要使用它来关闭重复的问题)。
set(cartesian product)
。 - NoBugsset(inputlist)
。不要对结果进行操作。 - CamilBitertools.product
的输出将包含重复项。因此,严格来说,itertools.product
不是笛卡尔积,除非您像@CamilB提到的那样将输入包装在set
中。 - Cameron Bieganek