Dodaj SUMĘ wartości dwóch LIST do nowej LISTY

135

Mam następujące dwie listy:

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

Teraz chcę dodać elementy z obu tych list do nowej listy.

wyjście powinno być

third = [7,9,11,13,15]
Prashant Gaur
źródło

Odpowiedzi:

221

zipFunkcja jest przydatna tutaj, używany z listowego.

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

Jeśli masz listę list (zamiast tylko dwóch):

lists_of_lists = [[1, 2, 3], [4, 5, 6]]
[sum(x) for x in zip(*lists_of_lists)]
# -> [5, 7, 9]
Tomek
źródło
1
tylko ciekawi, jak zareaguje zip (), jeśli długości tablic dla różnych? czyli co zwraca zip dla różnych długości tablic i jak wpłynie to na operację dla x + y
ealeon
8
@ealeon: "Zipper" zatrzymuje się, gdy najkrótsza iteracja zostanie wyczerpana. Więc jeśli firstma długość 10, a seconddługość 6, wynik spakowania iteracji będzie miał długość 6.
tom
Myślę, że to bardziej przydatne niż inne odpowiedzi bo można zrobić przydatne rzeczy takie jak Take średni lub podać inną wagę do poszczególnych elementów tablicy i połączyć je
seokhoonlee
Czy można to zrobić, jeśli nie znasz liczby list?
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

Z dokumentów

import operator
list(map(operator.add, first,second))
Thai Tran
źródło
2
miałeś na myśli: list (map (operator.add, first, second))
Ghanem
26

Domyślnym zachowaniem w numpy jest dodawanie komponentów

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

które wyjścia

array([7,9,11,13,15])
user3582790
źródło
Zdecydowanie najlepsza odpowiedź
Ian
Powinno działać, ale w moich eksperymentach nie ... Nie wiem dlaczego, ale numpy wydaje mi się potężną biblioteką, a także skomplikowaną ...
dekadencja
@decadenza Jak przeprowadziłeś eksperyment?
Ashfaq,
Cześć @Ashfaq, minęło wiele miesięcy i lepiej nauczyłem się biblioteki Numpy. Myliłem się w definicji np.array. Przepraszam.
decadenza,
1
użyj np.add (first, second) .tolist (), aby uzyskać wynik na liście
talekeDskobeDa
26

Zakładając, że obie listy ai bmają taką samą długość, nie trzeba zip, numpy lub cokolwiek innego.

Python 2.x i 3.x:

[a[i]+b[i] for i in range(len(a))]
matematyka
źródło
wydaje się to całkiem nieźle, jeśli mamy obliczyć sumę wynikową dla więcej niż 2 list
lazarus
11

Dotyczy to dowolnej liczby list:

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

W twoim przypadku myListOfListsbyłoby[first, second]

inspectorG4dget
źródło
1
Czy na pewno izip.from_iterable?
DSM,
1
@DSM: cholera! Myślę, że o tym myślałem chain. Zaktualizowano
inspectorG4dget
9

Wypróbuj poniższy kod:

first = [1, 2, 3, 4]
second = [2, 3, 4, 5]
third = map(sum, zip(first, second))
Maciej Puczkowski
źródło
+1 za to kompaktowe i intuicyjne rozwiązanie. Warto zauważyć, że działa to również w przypadku więcej niż 2 list:map(sum, zip(first, second, third, fourth, ...))
Johan Dettmar
6

Najłatwiejszym i szybkim sposobem na to jest:

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

Alternatywnie możesz użyć numpy sum:

from numpy import sum
three = sum([first,second], axis=0) # array([7,9,11,13,15])
Thiru
źródło
1
To ładnie uogólnia dłuższe listy list, czego właśnie potrzebowałem!
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
źródło
lambda x, y: x + ymoże być po prostu sum.
ggorlen
3

Jeśli masz nieznaną liczbę list o tej samej długości, możesz użyć poniższej funkcji.

Tutaj * args akceptuje zmienną liczbę argumentów listy (ale sumuje tylko taką samą liczbę elementów w każdym). Znak * jest ponownie używany do rozpakowywania elementów na każdej z list.

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

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

sum_lists(a,b)

Wynik:

[2, 4, 6]

Lub z 3 listami

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

Wynik:

[19, 19, 19, 19, 19]
Skrzydło
źródło
3

rozwiązanie jednowarstwowe

list(map(lambda x,y: x+y, a,b))
Człowiek cień
źródło
2

Moja odpowiedź jest powtarzana z Thiru, który odpowiedział na nią 17 marca o 9:25.

Było prościej i szybciej, oto jego rozwiązania:

Najłatwiejszym i szybkim sposobem na to jest:

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

Alternatywnie możesz użyć numpy sum:

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

Potrzebujesz numpy!

tablica numpy może wykonywać pewne operacje, takie jak wektory

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]
Kawałek
źródło
Nie potrzebujesz numpy, aby sumować elementy parami na dwóch listach.
ggorlen
1

Możesz użyć zip(), który „przepleci” dwie tablice razem, a następnie map()zastosuje funkcję do każdego elementu w iterowalnej:

>>> 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
źródło
1

Oto inny sposób, aby to zrobić. Korzystamy z wewnętrznej funkcji __add__ w Pythonie:

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)

Wynik

[11, 22, 33, 44, 55]
Stryker
źródło
1

Jeśli chcesz dodać również resztę wartości na listach, możesz tego użyć (to działa w Pythonie 3.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
źródło
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
źródło
1

Oto inny sposób na zrobienie tego, który dla mnie działa dobrze.

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
źródło
1
j = min(len(l1), len(l2))
l3 = [l1[i]+l2[i] for i in range(j)]
Vijay Kumar
źródło
1
Chociaż ten fragment kodu może być rozwiązaniem, dołączenie wyjaśnienia naprawdę pomaga poprawić jakość Twojego posta. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod.
Narendra Jadhav
1

Być może najprostsze podejście:

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
źródło
1

Jeśli uważasz swoje listy za tablicę numpy, musisz je łatwo zsumować:

import numpy as np

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

print third

[7, 9, 11, 13, 15]
Radvin
źródło
0

Co jeśli masz listę o różnej długości, możesz spróbować czegoś takiego (używając 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
źródło
-2

Możesz użyć tej metody, ale zadziała ona tylko wtedy, gdy obie listy mają ten sam rozmiar:

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
HelloUni
źródło