如何将 2 个短列表中的元素附加到另一个大元组列表中?
How to append elements from 2 short lists into another big list of 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 会增加。
你可以在 itertools.chain.from_iterable
and itertools.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')]
您正在寻找 l2
(l1
的第一个元素)和 l3
之间的笛卡尔积。由于结果将是一个元组,其中包含来自 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
并展平元组的原因。
玩 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')]]
假设我有以下列表:
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 会增加。
你可以在 itertools.chain.from_iterable
and itertools.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')]
您正在寻找 l2
(l1
的第一个元素)和 l3
之间的笛卡尔积。由于结果将是一个元组,其中包含来自 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
并展平元组的原因。
玩 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')]]