如何将2个短列表中的元素追加到另一个大元组列表中?

时间:2015-03-19 14:36:29

标签: python list tuples

说我有以下列表:

l1 = [('a','b','c'),('d','e','f'),('g','h','i'),('j','k','l')]
l2 = ['x','y','z']
l3 = ['m','n']

我想从l2和l3中提取元素,然后将l2 [i](i in range(len(l2)))作为每个元组中的第一个元素追加,并将l3 [i](i in range(len(l2)))作为最后一个元素在每个元组中。

所以结果将如下所示:

l1 = [('x','a','b','c','m'),('x','a','b','c','n'),('y','a','b','c','m'),('y','a','b','c','n'), ('z','a','b','c','m'),('z','a','b','c','n')]

是的,l1的len将会增加。

2 个答案:

答案 0 :(得分:3)

你可以在itertools.chain.from_iterableitertools.product的帮助下做到这一点,并获得笛卡尔积,如下

>>> from itertools import chain, product
>>> from pprint import pprint
>>> pprint([tuple(chain.from_iterable(i)) for i in product(l2, [l1[0]], l3)])
[('x', 'a', 'b', 'c', 'm'),
 ('x', 'a', 'b', 'c', 'n'),
 ('y', 'a', 'b', 'c', 'm'),
 ('y', 'a', 'b', 'c', 'n'),
 ('z', 'a', 'b', 'c', 'm'),
 ('z', 'a', 'b', 'c', 'n')]

您正在l2l1l3的第一个元素之间找到笛卡尔积。由于结果将是一个元组,其元素来自l2(一个字符串)和l1的第一个元素(一个元组)和一个来自l3的元素(一个字符串),我们会扁平化它与chain.from_iterable

让我们说我们不会弄平元组,那么这就是你将得到的

>>> pprint([tuple(items) for items in product(l2, [l1[0]], l3)])
[('x', ('a', 'b', 'c'), 'm'),
 ('x', ('a', 'b', 'c'), 'n'),
 ('y', ('a', 'b', 'c'), 'm'),
 ('y', ('a', 'b', 'c'), 'n'),
 ('z', ('a', 'b', 'c'), 'm'),
 ('z', ('a', 'b', 'c'), 'n')]

这就是我们使用chain.from_iterable并展平元组的原因。

答案 1 :(得分:1)

如何使用zip和列表理解:

>>> [zip(*i) for i in zip(zip(l2,l2),zip(l1,l1),(l3 for _ in range(2*len(l1))))]
[[('x', ('a', 'b', 'c'), 'm'), ('x', ('a', 'b', 'c'), 'n')], [('y', ('d', 'e', 'f'), 'm'), ('y', ('d', 'e', 'f'), 'n')], [('z', ('g', 'h', 'i'), 'm'), ('z', ('g', 'h', 'i'), 'n')]]