从两个列表创建自定义组合
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 的元组。
我正在使用大型 L1
和 L2
,因此以上示例仅用于说明。我不确定如何解决这个问题。我考虑过使用 itertools
permutation
和 combination
模块,但我没有得到上面的列表 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')
我希望使用两个列表:
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')
但对于循环效率不高的大型组合。
既然听起来你想让 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')