我希望使用两个列表:
L1 = ['a', 's', 'd']
L2 = [str(1), str(2)]
我需要创建第三个列表:
L3 = [(a1, s1, d1), (a1, s1, d2), ... ]
L3具有大小为3的元组,其中每个元组仅具有来自L1的非重复元素,但可以具有来自L2的重复元素。
即允许一对(a1, s2, d2)
,但不允许(a1, a2, d1)
。
L3
具有大小为3的元组。
我正在使用大型L1
和L2
,因此上述示例仅用于说明。我不确定如何解决这个问题。我曾考虑过使用itertools
permutation
和combination
模块,但是我没有得到上面的列表L3
。一种蛮力解决方案是做一些事情:
L3 = list(itertools.combinations(list(itertools.product(L1, L2)), 3))
,然后将元素作为('a', '1'), ('a', '2'), ('d', '2')
进行条件处理,但条件是对于循环而言效率不高的大型组合。
答案 0 :(得分:2)
由于听起来您希望L1成为元组的第一个元素,所以我认为我们只需要压缩它们,而不是重复它们。我们只需要取L2的乘积即可。
In [327]: [list(zip(L1, p)) for p in itertools.product(L2, repeat=len(L1))]
Out[327]:
[[('a', '1'), ('s', '1'), ('d', '1')],
[('a', '1'), ('s', '1'), ('d', '2')],
[('a', '1'), ('s', '2'), ('d', '1')],
[('a', '1'), ('s', '2'), ('d', '2')],
[('a', '2'), ('s', '1'), ('d', '1')],
[('a', '2'), ('s', '1'), ('d', '2')],
[('a', '2'), ('s', '2'), ('d', '1')],
[('a', '2'), ('s', '2'), ('d', '2')]]
如果您不想一次实现整个对象,则可以用[
和]
替换(
和)
以将listcomp变成genexp
如果要将元组的元素合并为一个字符串,也可以这样做:
In [338]: gen = (tuple(''.join(pair) for pair in zip(L1, p))
for p in itertools.product(L2, repeat=len(L1)))
In [339]: for elem in gen:
...: print(elem)
('a1', 's1', 'd1')
('a1', 's1', 'd2')
('a1', 's2', 'd1')
('a1', 's2', 'd2')
('a2', 's1', 'd1')
('a2', 's1', 'd2')
('a2', 's2', 'd1')
('a2', 's2', 'd2')