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]
Pygaur
quelle

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]
Tom
quelle
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
49

Aus Dokumenten

import operator
list(map(operator.add, first,second))
Thai Tran
quelle
2
Sie meinten: Liste (Karte (operator.add, erste, zweite))
Ghanem
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))]
Mathematik
quelle
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])
user3582790
quelle
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]

inspectorG4dget
quelle
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))
Maciej Puczkowski
quelle
+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])
Thiru
quelle
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]
Anurag Misra
quelle
3

Einzeilerlösung

list(map(lambda x,y: x+y, a,b))
Schattenmann
quelle
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]
Stück
quelle
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]
Flügel
quelle
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]
cdhowie
quelle
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]
Stryker
quelle
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))
christianAV
quelle
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]
Bala Srinivasan
quelle
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("")
Sidharth Yadav
quelle
1
j = min(len(l1), len(l2))
l3 = [l1[i]+l2[i] for i in range(j)]
Vijay Kumar
quelle
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)
Rishabh Kumar
quelle
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]
Radvin
quelle
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]
Mohammed Wazeem
quelle
-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
HalloUni
quelle