我试图逐渐使一个列表与另一个列表交织。我的意思是:从列表开始
a0 = list(range(3)) # [0, 1, 2]
a1 = list(range(10, 13)) # [10, 11, 12]
我希望能够迭代组合
[0, 1, 2]
[10, 1, 2]
[0, 11, 2]
[10, 11, 2]
[0, 1, 12]
[10, 1, 12]
[0, 11, 12]
[10, 11, 12]
首先将a0
的任何元素都不替换为a1
的相应元素,然后依次是一个,然后两个和所有元素。
到目前为止,我想出了什么:
a01 = list(zip(a0, a1))
for i in range(1<<len(a0)):
print(list(item[(i >> j) & 1] for j, item in enumerate(a01)))
我zip
一起列出列表,并使用i
作为标志,告诉我从哪个列表中选择元素。
这似乎很不雅致。还有更优雅的东西吗?我觉得itertools
提供了可以在此处使用的功能,但到目前为止我还不清楚。
此处duplicate中的建议是:
from itertools import product
for item in product(*zip(a0, a1)):
print(item)
这将产生期望的结果(以不同的顺序)。
要获得正确的订单meowgoesthedog,请在注释中提出建议:
list(map(lambda x: tuple(reversed(x)), product(*reversed(list(zip(a0, a1))))))
这回答了问题。