如何将N个多列表合并为一个大的多列表?

时间:2019-06-17 12:49:47

标签: python list itertools

我有n个多列表。我想将它们合并为一个大型多列表。 示例:

   listA =  [[1,2],[3,4],[6,7]]
   listB =  [[10,20],[30,40],[60,70]]

输出:

  listAB = [[1,2,10,20],[3,4,30,40],[6,7,60,70]]

这是我编写的计算上面代码的代码:

listAB,tmp = [],[]
for i in range(len(listA)):
    for j in range(len(listA[i])):
        tmp.append(listA[i][j])
        tmp.append(listB[i][j])
    listAB.append(tmp)
    tmp = []

仅当您有两个列表且子列表的长度相同时,此代码才有效。我想合并多个具有不同长度的子列表的多列表。 itertools中是否有一些功能可以做到这些?

例如:

   listA =  [[1,2,3],[3,4,5],[6,7,8]]
   listB =  [[10,20],[30,40],[60,70]]
   listC =  [[4,4],[5,5],[6]]

   listABC = [[1,2,3,10,20,4,4],
              [3,4,5,30,40,5,5],
              [6,7,8,60,70,6]]

3 个答案:

答案 0 :(得分:6)

zip一起列出列表,并使用itertools.chain连接输出元组:

from itertools import chain

listABC = [list(chain.from_iterable(i)) for i in zip(listA, listB, listC)]

输出:

[[1, 2, 3, 10, 20, 4, 4], [3, 4, 5, 30, 40, 5, 5], [6, 7, 8, 60, 70, 6]]

尽管对于3个输入,直接附加列表较为简单,但通过这种方法,您还可以使用star运算符传递任意数量的列表

# this can also be a tuple or any iterable
list_of_lists = [listA, listB, listC, listD ... ]

[list(chain.from_iterable(i)) for i in zip(*list_of_lists)]

更新:使用functools代替itertools(根据与ReblochonMasque的讨论)的替代解决方案(不推荐使用):

from functools import reduce

[reduce(lambda x,y: x+y, i) for i in zip(listA, listB, listC)]

答案 1 :(得分:4)

对于两个序列,您可以将它们添加到列表理解中:

[a+b for a, b in zip(A, B)]

对于两个以上的问题,@meowgoesthedog答案是合适的。
如果由于某些原因您不能使用itertools,则可以这样做:

def merge(seq1, seq2):
    return (a+b for a, b in zip(seq1, seq2))

def merge_all(s):
    res = merge(s[0], s[1])
    for sn in s[2:]:
        res = merge(res, sn)
    return list(res)

A =  [[1,2],[3,4],[6,7]]
B =  [[10,20],[30,40],[60,70]]
C =  [[4,4],[5,5],[6]]

seq = [A, B, C]
merge_all(seq)

答案 2 :(得分:1)

我相信您可以通过使用任何itertools的一些简单代码(不带代码)合并多个具有不同长度的子列表的多列表:

listCom = []
for n in range(len(listA)):
    listCom.append(listA[n] + listB[n] + listC[n])
listCom

输出为:

[[1, 2, 3, 10, 20, 4, 4], [3, 4, 5, 30, 40, 5, 5], [6, 7, 8, 60, 70, 6]]