Списки сумм различной длины

Какой лучший способ суммировать два или более списков, даже если они имеют разную длину?

Например, у меня есть:

lists = [[1, 2], [0, 3, 4], [5]]

и результат должен быть:

result = [6, 5, 4]

Ответ 1

Вы можете использовать itertools.izip_longest() и использовать fillvalue равный 0

In [6]: [sum(x) for x in itertools.izip_longest(*lists, fillvalue=0)]
Out[6]: [6, 5, 4]

для Python < 2.6:

In [27]: ml = max(map(len, lists))

In [28]: ml       #length of the longest list in lists
Out[28]: 3

In [29]: [sum(x) for x in zip(*map(lambda x:x+[0]*ml if len(x)<ml else x, lists))]
Out[29]: [6, 5, 4]

Ответ 2

Лучшее, что я придумал, следующее:

result = [sum(filter(None, i)) for i in map(None, *lists)]

Это не так уж плохо, но я должен добавить NoneTypes, а затем отфильтровать их, чтобы подвести итоги.

Ответ 3

#You can do the same without using predefined header files.
def sumlists(a,b,c):
    sumlist = []
    while(len(a)!=len(b) or len(a)!=len(c)):
        if len(a)>len(b):
            b.append(0)
        if len(a)>len(c):
            c.append(0)
        elif len(b)>len(a):
            a.append(0)
        if len(b)>len(c):
             c.append(0)
        elif len(c)>len(a):
            a.append(0)
        if len(c)>len(b):
             b.append(0)
    for i,j,k in zip(a,b,c):
         sumlist.append(i+j+k)
    return sumlist
 print(sumlists([1,2],[0,3,4],[5]))

Ответ 4

#You can do the same without using predefined header files.
def sumlists(a,b,c):
    sumlist = []
    while(len(a)!=len(b) or len(a)!=len(c)):
        if len(a)>len(b):
            b.append(0)
        if len(a)>len(c):
            c.append(0)
        elif len(b)>len(a):
            a.append(0)
        if len(b)>len(c):
             c.append(0)
        elif len(c)>len(a):
            a.append(0)
        if len(c)>len(b):
             b.append(0)
    for i,j,k in zip(a,b,c):
         sumlist.append(i+j+k)
    return sumlist
 print(sumlists([1,2],[0,3,4],[5]))