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

3

假设我有以下列表:

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的长度将会增加。


那么你只关心 l1 中的第一个元组,对吗? - Zero Piraeus
2个回答

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')]

您正在计算 l1 的第一个元素、l2l3 之间的笛卡尔积。由于结果将是一个包含来自 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

玩一下 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')]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接