从两个列表创建自定义组合

时间:2018-07-20 17:49:53

标签: python-3.5

我希望使用两个列表:

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的元组。

我正在使用大型L1L2,因此上述示例仅用于说明。我不确定如何解决这个问题。我曾考虑过使用itertools permutationcombination模块,但是我没有得到上面的列表L3。一种蛮力解决方案是做一些事情:

L3 = list(itertools.combinations(list(itertools.product(L1, L2)), 3)) 

,然后将元素作为('a', '1'), ('a', '2'), ('d', '2')进行条件处理,但条件是对于循环而言效率不高的大型组合。

1 个答案:

答案 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')