我怎样才能逐渐将一个列表转换为另一个列表(2个列表的笛卡尔积)?

Jon*_*han 0 python

说我有两个清单,

one = ['a1', 'b1', 'c1']
two = ['a2', 'b2', 'c2']
Run Code Online (Sandbox Code Playgroud)

我想生成这些项目的所有可能组合的集合,而不更改它们在各自列表中的位置.所以对于上面的例子,它是:

['a1', 'b1', 'c1']
['a1', 'b1', 'c2']
['a1', 'b2', 'c2']
['a2', 'b1', 'c1']
['a2', 'b2', 'c1']
['a2', 'b2', 'c2']
Run Code Online (Sandbox Code Playgroud)

我正在寻找itertools希望找到符合此描述的东西,但我还没找到.

Ror*_*ton 5

您正在寻找的功能是,product但您需要先设置它.问题是你的值是"横向" - 你想把第一个位置的所有可能值放在一起,然后放在第二个位置,等等.你可以用*zip()机动"转置"你的数据.

from itertools import product
list(product(*zip(one, two)))
Run Code Online (Sandbox Code Playgroud)

结果是

[('a1', 'b1', 'c1'),
 ('a1', 'b1', 'c2'),
 ('a1', 'b2', 'c1'),
 ('a1', 'b2', 'c2'),
 ('a2', 'b1', 'c1'),
 ('a2', 'b1', 'c2'),
 ('a2', 'b2', 'c1'),
 ('a2', 'b2', 'c2')]
Run Code Online (Sandbox Code Playgroud)

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

[list(v) for v in product(*zip(one, two))]
Run Code Online (Sandbox Code Playgroud)

给你的

[['a1', 'b1', 'c1'],
 ['a1', 'b1', 'c2'],
 ['a1', 'b2', 'c1'],
 ['a1', 'b2', 'c2'],
 ['a2', 'b1', 'c1'],
 ['a2', 'b1', 'c2'],
 ['a2', 'b2', 'c1'],
 ['a2', 'b2', 'c2']]
Run Code Online (Sandbox Code Playgroud)

请注意,这些并不是您列出的所需输出,因为您遗漏了几种可能性.