合并列表列表

时间:2016-02-19 11:13:32

标签: python list

我有两个列表,它们具有相同数量的项目。这两个列表如下所示:

L1 = [[1, 2], [3, 4], [5, 6, 7]]

L2 =[[a, b], [c, d], [e, f, g]]

我希望创建一个如下所示的列表:

Lmerge = [[[a, 1], [b,2]], [[c,3], [d,4]], [[e,5], [f,6], [g,7]]]

我试图使用map()

map(list.__add__, L1, L2)但输出会产生一个单位列表。

组合两个列表列表的最佳方法是什么?提前谢谢。

2 个答案:

答案 0 :(得分:7)

您可以zip列表,然后再zip生成的元组...

>>> L1 = [[1, 2], [3, 4], [5, 6, 7]]
>>> L2 =[['a', 'b'], ['c', 'd'], ['e', 'f', 'g']]
>>> [list(zip(a,b)) for a,b in zip(L2, L1)]
[[('a', 1), ('b', 2)], [('c', 3), ('d', 4)], [('e', 5), ('f', 6), ('g', 7)]]

如果您需要完整列表,请与`map:

结合使用
>>> [list(map(list, zip(a,b))) for a,b in zip(L2, L1)]
[[['a', 1], ['b', 2]], [['c', 3], ['d', 4]], [['e', 5], ['f', 6], ['g', 7]]]

答案 1 :(得分:3)

您使用map开启了正确的轨道。

这是替换第一个版本的第一个版本,由tobias_k,zip加上两个列表中相应的元素:

>>> zipped = map(zip, L2, L1)
>>> list(map(list, zipped)) # evaluate to a list of lists
[[('a', 1), ('b', 2)], [('c', 3), ('d', 4)], [('e', 5), ('f', 6), ('g', 7)]]

如评论中所述,在Python 2中,简短的map(zip, L2, L1)就足够了。

map(zip, L2, L1)也适用于Python 3,因为您只需迭代一次,并且您不需要通过索引进行序列访问。如果您需要多次迭代,您可能会对itertools.tee感兴趣。

第二版的缩写替代方案:

>>> [list(map(list, x)) for x in map(zip, L2, L1)]
[[['a', 1], ['b', 2]], [['c', 3], ['d', 4]], [['e', 5], ['f', 6], ['g', 7]]]

最后,还有:

>>> from functools import partial
>>> map(partial(map, list), map(zip, L2, L1))
[[['a', 1], ['b', 2]], [['c', 3], ['d', 4]], [['e', 5], ['f', 6], ['g', 7]]]