如何通过添加每个元素来合并两个或多个列表

时间:2018-09-12 04:23:01

标签: python python-2.7

我的列表仅包含[1,2,3][4,5,6]之类的整数。有时我什至有[7,8,9]个或更多列表。如何将每个元素加在一起以形成相同长度的新列表?

[1,2,3] + [4,5,6] + [7,8,9] = [12,15,18]

我知道上面只是添加了元素并创建了一个较长的列表(包含9个元素),但是我想逐个添加列表。

4 个答案:

答案 0 :(得分:5)

您可以将列表放在列表中,zip子列表用*运算符解压缩后,然后将map sum放到列表中:< / p>

l = [[1,2,3], [4,5,6], [7,8,9]]
print(list(map(sum, zip(*l))))

这将输出:

[12, 15, 18]

编辑:上面是针对Python 3.x的。如果使用的是较早版本,则可以使用itertools.izip代替zip,并且不需要调用list构造函数:

import itertools
l = [[1,2,3], [4,5,6], [7,8,9]]
print map(sum, itertools.izip(*l))

答案 1 :(得分:0)

Numpy非常适合完成此任务,尽管对于您的情况来说可能有些过分。

假设您有

x = [1,2,3]   y = [4,5,6]   z = [7,8,9]

您可以将它们转换为数组并求和:

np.array([x, y, z]).sum(axis=0)

您可以对常规列表和zip使用类似的方法:

[sum(col) for col in zip(x, y, z)]

答案 2 :(得分:0)

您可以这样做:

#Create the list
x = [1,2,3,12,13]
y = [4,5,7,11]
z = [7,8,9,14,15,16]
#create a list with the list length
lenList = [len(x),len(y),len(z)]

finalList = []
#get the minimum and maximum list length
minLen = min(lenList)
maxLen = max(lenList)
#if the three list have the same length then you can simply sum the element
if(maxLen == minLen):
    for j in range(maxLen):
        finalList.append(x[j]+y[j]+z[j])
else:
    #if the list have different length look for the minimum value
    while(lenList[0] != lenList[1] or lenList[0] != lenList[2]):
        minLen = min(lenList)
        maxLen = max(lenList)
        #if the min len is the x list then add some zero
        if(lenList.index(minLen) == 0):
            #change the len to the max len
            lenList[0] = maxLen
            for a in range(minLen,maxLen):
                x.append(0)
        #if the min len is the y list then add some zero
        elif(lenList.index(minLen) == 1):
            lenList[1] = maxLen
            for b in range(minLen,maxLen):
                y.append(0)
        #if the min len is the z list then add some zero
        elif(lenList.index(minLen) == 2):
            lenList[2] = maxLen
            for c in range(minLen,maxLen):
                z.append(0)
    #sum all the element
    for j in range(0,maxLen):
        finalList.append(x[j]+y[j]+z[j])

print finalList

输出:

[12, 15, 19, 37, 28, 16]

评论:

该程序可以对所有列表元素求和,并将结果插入另一个列表中。您可以对3个具有无限元素且列表长度不相同的列表求和。如果您需要汇总更多列表,只需编辑此部分:

while(lenList[0] != lenList[1] or lenList[0] != lenList[2]):
        minLen = min(lenList)
        maxLen = max(lenList)
        #if the min len is the x list then add some zero
        if(lenList.index(minLen) == 0):
            #change the len to the max len
            lenList[0] = maxLen
            for a in range(minLen,maxLen):
                x.append(0)
        #if the min len is the y list then add some zero
        elif(lenList.index(minLen) == 1):
            lenList[1] = maxLen
            for b in range(minLen,maxLen):
                y.append(0)
        #if the min len is the z list then add some zero
        elif(lenList.index(minLen) == 2):
            lenList[2] = maxLen
            for c in range(minLen,maxLen):
                z.append(0)

您可以在此处添加:

elif(lenList.index(minLen) == 3):
            lenList[3] = maxLen
            for c in range(minLen,maxLen):
                listN.append(0)

之后,您必须添加列表:

#Create the list
x = [1,2,3,12,13]
y = [4,5,7,11]
z = [7,8,9,14,15,16]
listN = [0,0,0]
#create a list with the list length
lenList = [len(x),len(y),len(z),len(listN)]

在求和迭代中,您必须更改:

#sum all the element
    for j in range(0,maxLen):
        finalList.append(x[j]+y[j]+z[j],listN[j])

答案 3 :(得分:0)

如果您知道子列表的长度为3,则为另一种方法

/*

输出

a = [1,2,3] + [4,5,6] + [7,8,9]
[sum([a[3*q+i] for q in range(len(a)//3)]) for i in range(len(a)//3)]

或者

[12,15,18]

您可以将3换成您使用的长度,但是由于您在代码中显示了它们已经放置在此处,所以我将无法自动读取它。什么是替代解决方案,然后字典使用散列,所以如果您的列表很大,就不会有问题。