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

Creating custom combination from two lists

我希望使用两个列表:

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') 但对于循环效率不高的大型组合。

既然听起来你想让 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')