Fügen Sie die Summe der Werte von zwei LISTEN in die neue LISTE ein


135

Ich habe die folgenden zwei Listen:

first = [1,2,3,4,5]
second = [6,7,8,9,10]

Jetzt möchte ich die Elemente aus diesen beiden Listen zu einer neuen Liste hinzufügen.

Ausgabe sollte sein

third = [7,9,11,13,15]

Antworten:


210

Die zipFunktion ist hier nützlich und wird mit einem Listenverständnis verwendet.

[x + y for x, y in zip(first, second)]

Wenn Sie eine Liste von Listen haben (anstelle von nur zwei Listen):

lists_of_lists = [[1, 2, 3], [4, 5, 6]]
[sum(x) for x in zip(*lists_of_lists)]
# -> [5, 7, 9]

1
nur neugierig, wie würde zip () umgehen, wenn Array-Längen für verschiedene? dh was gibt zip für verschiedene Array-Längen zurück und wie würde sich das auf die Operation für x + y
ealeon

7
@ealeon: Das "Zippen" stoppt, wenn die kürzeste iterable erschöpft ist. Wenn firstalso Länge 10 und secondLänge 6 ist, ist das Ergebnis des Zippens der Iterables Länge 6.
Tom

Ich denke, es ist nützlicher als andere Antworten, denn Sie können nützliche Dinge tun, wie den Durchschnitt nehmen oder jedem Element im Array ein anderes Gewicht geben und sie kombinieren
seokhoonlee

Gibt es eine Möglichkeit, dies zu tun, wenn Sie die Anzahl der Listen nicht kennen?
traggatmot

@traggatmot:>>> lists_of_lists = [[1, 2, 3], [4, 5, 6]] >>> [sum(x) for x in zip(*lists_of_lists)] [5, 7, 9]
Tom


27

Angenommen, beide Listen aundb haben gleiche Länge haben , brauchen Sie nicht zip, numpy oder irgendetwas anderes.

Python 2.x und 3.x:

[a[i]+b[i] for i in range(len(a))]

Dies scheint ziemlich gut zu sein, wenn wir die resultierende Summenliste für mehr als 2 Listen berechnen müssen
Lazarus

25

Das Standardverhalten in numpy ist das komponentenweise Hinzufügen

import numpy as np
np.add(first, second)

welche Ausgänge

array([7,9,11,13,15])

Mit Abstand die beste Antwort
Ian

Es sollte funktionieren, aber in meinen Experimenten funktioniert es nicht ... Ich weiß nicht warum, aber Numpy scheint mir sowohl eine mächtige als auch eine komplizierte Bibliothek zu sein ...
Decadenza

@decadenza Wie hast du das Experiment gemacht?
Ashfaq

Hallo @Ashfaq, viele Monate sind vergangen und ich habe die Numpy-Bibliothek besser gelernt. Ich habe mich in der Definition von np.array geirrt. Es tut uns leid.
Decadenza

Verwenden Sie np.add (erste, zweite) .tolist (), um das Ergebnis in einer Liste zu erhalten
TalekeDskobeDa

11

Dies erstreckt sich auf eine beliebige Anzahl von Listen:

[sum(sublist) for sublist in itertools.izip(*myListOfLists)]

In Ihrem Fall myListOfListswäre[first, second]


1
Bist du dir sicher izip.from_iterable?
DSM

1
@DSM: Verdammt! Ich glaube ich habe daran gedacht chain. Aktualisiert
inspectorG4dget

9

Versuchen Sie den folgenden Code:

first = [1, 2, 3, 4]
second = [2, 3, 4, 5]
third = map(sum, zip(first, second))

+1 für diese kompakte und selbsterklärende Lösung. Es ist erwähnenswert, dass dies auch für mehr als 2 Listen funktioniert:map(sum, zip(first, second, third, fourth, ...))
Johan Dettmar

6

Der einfache und schnelle Weg, dies zu tun, ist:

three = [sum(i) for i in zip(first,second)] # [7,9,11,13,15]

Alternativ können Sie numpy sum verwenden:

from numpy import sum
three = sum([first,second], axis=0) # array([7,9,11,13,15])

1
Dies lässt sich gut auf längere Listen von Listen verallgemeinern, was genau das ist, was ich brauchte!
Vectornaut

5
first = [1, 2, 3, 4, 5]
second = [6, 7, 8, 9, 10]
three = map(lambda x,y: x+y,first,second)
print three



Output 
[7, 9, 11, 13, 15]


2

Meine Antwort wird mit Thirus wiederholt, der sie am 17. März um 9:25 Uhr beantwortete.

Es war einfacher und schneller, hier sind seine Lösungen:

Der einfache und schnelle Weg, dies zu tun, ist:

 three = [sum(i) for i in zip(first,second)] # [7,9,11,13,15]

Alternativ können Sie numpy sum verwenden:

 from numpy import sum
 three = sum([first,second], axis=0) # array([7,9,11,13,15])

Du brauchst Numpy!

Das numpy-Array könnte eine Operation wie Vektoren ausführen

import numpy as np
a = [1,2,3,4,5]
b = [6,7,8,9,10]
c = list(np.array(a) + np.array(b))
print c
# [7, 9, 11, 13, 15]

2

Wenn Sie eine unbekannte Anzahl von Listen gleicher Länge haben, können Sie die folgende Funktion verwenden.

Hier akzeptiert * args eine variable Anzahl von Listenargumenten (summiert jedoch jeweils nur die gleiche Anzahl von Elementen). Das * wird erneut verwendet, um die Elemente in jeder der Listen zu entpacken.

def sum_lists(*args):
    return list(map(sum, zip(*args)))

a = [1,2,3]
b = [1,2,3]  

sum_lists(a,b)

Ausgabe:

[2, 4, 6]

Oder mit 3 Listen

sum_lists([5,5,5,5,5], [10,10,10,10,10], [4,4,4,4,4])

Ausgabe:

[19, 19, 19, 19, 19]

1

Sie können verwenden zip(), wodurch die beiden Arrays miteinander "verschachtelt" werden und anschließend map()eine Funktion auf jedes Element in einer Iteration angewendet wird:

>>> a = [1,2,3,4,5]
>>> b = [6,7,8,9,10]
>>> zip(a, b)
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]
>>> map(lambda x: x[0] + x[1], zip(a, b))
[7, 9, 11, 13, 15]

1

Hier ist eine andere Möglichkeit, dies zu tun. Wir nutzen die interne __add__ -Funktion von Python:

class SumList(object):
    def __init__(self, this_list):
        self.mylist = this_list

    def __add__(self, other):
        new_list = []
        zipped_list = zip(self.mylist, other.mylist)
        for item in zipped_list:
            new_list.append(item[0] + item[1])
        return SumList(new_list)

    def __repr__(self):
        return str(self.mylist)

list1 = SumList([1,2,3,4,5])
list2 = SumList([10,20,30,40,50])
sum_list1_list2 = list1 + list2
print(sum_list1_list2)

Ausgabe

[11, 22, 33, 44, 55]

1

Wenn Sie auch den Rest der Werte in den Listen hinzufügen möchten, können Sie dies verwenden (dies funktioniert in Python3.5).

def addVectors(v1, v2):
    sum = [x + y for x, y in zip(v1, v2)]
    if not len(v1) >= len(v2):
        sum += v2[len(v1):]
    else:
        sum += v1[len(v2):]

    return sum


#for testing 
if __name__=='__main__':
    a = [1, 2]
    b = [1, 2, 3, 4]
    print(a)
    print(b)
    print(addVectors(a,b))

1
    first = [1,2,3,4,5]
    second = [6,7,8,9,10]
    #one way
    third = [x + y for x, y in zip(first, second)]
    print("third" , third) 
    #otherway
    fourth = []
    for i,j in zip(first,second):
        global fourth
        fourth.append(i + j)
    print("fourth" , fourth )
#third [7, 9, 11, 13, 15]
#fourth [7, 9, 11, 13, 15]

1

Hier ist ein anderer Weg, es zu tun. Es funktioniert gut für mich.

N=int(input())
num1 = list(map(int, input().split()))
num2 = list(map(int, input().split()))
sum=[]

for i in range(0,N):
  sum.append(num1[i]+num2[i])

for element in sum:
  print(element, end=" ")

print("")

1
j = min(len(l1), len(l2))
l3 = [l1[i]+l2[i] for i in range(j)]

1
Während dieses Code-Snippet die Lösung sein kann, hilft das Hinzufügen einer Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
Narendra Jadhav

1

Vielleicht der einfachste Ansatz:

first = [1,2,3,4,5]
second = [6,7,8,9,10]
three=[]

for i in range(0,5):
    three.append(first[i]+second[i])

print(three)

1

Wenn Sie Ihre Listen als numpy-Array betrachten, müssen Sie sie einfach summieren:

import numpy as np

third = np.array(first) + np.array(second)

print third

[7, 9, 11, 13, 15]

0

Was ist, wenn Sie eine Liste mit unterschiedlicher Länge haben, dann können Sie so etwas ausprobieren (mit zip_longest)

from itertools import zip_longest  # izip_longest for python2.x

l1 = [1, 2, 3]
l2 = [4, 5, 6, 7]

>>> list(map(sum, zip_longest(l1, l2, fillvalue=0)))
[5, 7, 9, 7]

-2

Sie können diese Methode verwenden, sie funktioniert jedoch nur, wenn beide Listen dieselbe Größe haben:

first = [1, 2, 3, 4, 5]
second = [6, 7, 8, 9, 10]
third = []

a = len(first)
b = int(0)
while True:
    x = first[b]
    y = second[b]
    ans = x + y
    third.append(ans)
    b = b + 1
    if b == a:
        break

print third
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.