如何逐步将一个列表变成另一个列表(两个列表的笛卡尔积)?

时间:2018-07-12 00:01:13

标签: python

说我有两个列表,

one = ['a1', 'b1', 'c1']
two = ['a2', 'b2', 'c2']

我想生成这些项目所有可能组合的集合,而无需更改它们在各自列表中的位置。因此,对于上面的示例,它是:

['a1', 'b1', 'c1']
['a1', 'b1', 'c2']
['a1', 'b2', 'c2']
['a2', 'b1', 'c1']
['a2', 'b2', 'c1']
['a2', 'b2', 'c2']

我正在寻找itertools,希望找到与该描述相匹配的内容,但是我还没有找到。

1 个答案:

答案 0 :(得分:5)

您要查找的功能是product,但您需要先对其进行设置。问题在于您的值“横向”放置-您想将第一个位置的所有可能值放在一起,然后将第二个位置的所有可能值放在一起,依此类推。您可以通过*zip()操作“转置”数据。

from itertools import product
list(product(*zip(one, two)))

结果是

[('a1', 'b1', 'c1'),
 ('a1', 'b1', 'c2'),
 ('a1', 'b2', 'c1'),
 ('a1', 'b2', 'c2'),
 ('a2', 'b1', 'c1'),
 ('a2', 'b1', 'c2'),
 ('a2', 'b2', 'c1'),
 ('a2', 'b2', 'c2')]

如果您真的想要列表而不是元组,请使用

[list(v) for v in product(*zip(one, two))]

给你

[['a1', 'b1', 'c1'],
 ['a1', 'b1', 'c2'],
 ['a1', 'b2', 'c1'],
 ['a1', 'b2', 'c2'],
 ['a2', 'b1', 'c1'],
 ['a2', 'b1', 'c2'],
 ['a2', 'b2', 'c1'],
 ['a2', 'b2', 'c2']]

请注意,由于您遗漏了几种可能性,因此这些与您列出的期望输出并不完全相同。