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]

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]

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


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])

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))]

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]


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))

+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])

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]

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]


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]

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]

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]

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))

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

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("")

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

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)

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]

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]

-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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.