我有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]]
答案 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]]