如何从一组列表中获取笛卡尔积(每种可能的值组合)?
例如,给定
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以获得更具体的副本。类似地,该技术可用于“分解”具有列表值的字典;请参阅Combine Python Dictionary Permutations into List of Dictionaries .
如果您想要多次相同列表与其自身的笛卡尔积,itertools.product
可以优雅地处理这个问题。请参阅Operation on every pair of element in a list或How can I get "permutations with repetitions" from a list (Cartesian product of a list with itself)? .
许多已经了解 itertools.product
的人都在苦苦挣扎,因为它需要为每个输入序列提供单独的参数,而不是例如列表的列表。接受的答案显示了如何使用 *
处理此问题。但是,此处使用 *
来解包参数与在函数调用中使用它的任何其他时间根本上没有什么不同。请参阅Expanding tuples into arguments对于这个主题(并根据需要使用它来关闭重复的问题)。
最佳答案
使用itertools.product
,自 Python 2.6 起可用。
import itertools
somelists = [
[1, 2, 3],
['a', 'b'],
[4, 5]
]
for element in itertools.product(*somelists):
print(element)
这与:
相同for element in itertools.product([1, 2, 3], ['a', 'b'], [4, 5]):
print(element)
关于python - 如何获得多个列表的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56302731/