Aggiungi SOMMA di valori di due ELENCHI nel nuovo ELENCO


135

Ho le seguenti due liste:

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

Ora voglio aggiungere gli elementi di entrambi questi elenchi in un nuovo elenco.

l'output dovrebbe essere

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

Risposte:


212

La zipfunzione è utile qui, utilizzata con una comprensione dell'elenco.

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

Se hai un elenco di elenchi (anziché solo due elenchi):

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

1
solo curioso come gestirà zip () se la lunghezza dell'array fosse diversa? vale a dire cosa restituisce zip per diverse lunghezze di array e in che modo ciò influirebbe sull'operazione per x + y
ealeon

7
@ealeon: lo "zippare" si interrompe quando viene esaurito il più breve iterabile. Quindi, se firstè lunghezza 10 ed secondè lunghezza 6, il risultato della compressione degli iterabili sarà lunghezza 6.
tom

Penso che sia più utile di altre risposte perché puoi fare cose utili come prendere la media o dare un peso diverso a ciascun elemento dell'array e combinarli
seokhoonlee

C'è un modo per farlo quando non si conosce il numero di elenchi?
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

Supponendo entrambi gli elenchi aeb hanno stessa lunghezza, non hai bisogno di zip, NumPy o qualsiasi altra cosa.

Python 2.xe 3.x:

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

questo sembra abbastanza buono, se dobbiamo calcolare l'elenco di somma risultante per più di 2 elenchi
lazzaro

25

Il comportamento predefinito in numpy è aggiungi per componente

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

quali uscite

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

Di gran lunga la risposta migliore
Ian,

Dovrebbe funzionare, ma nei miei esperimenti non ... Non so perché, ma numpy mi sembra una libreria potente e complicata ...
Decadenza,

@decadenza Come hai fatto l'esperimento?
Ashfaq,

Ciao @Ashfaq, sono passati molti mesi e ho imparato meglio la biblioteca di Numpy. Ho sbagliato nella definizione di np.array. Scusate.
decadenza,

usa np.add (primo, secondo) .tolist () per ottenere il risultato in un elenco
talekeDskobeDa

11

Questo si estende a qualsiasi numero di elenchi:

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

Nel tuo caso, myListOfListssarebbe[first, second]


1
Ne sei sicuro izip.from_iterable?
DSM,

1
@DSM: dannazione! Penso che stavo pensando chain. Aggiornato
inspectorG4dget il

9

Prova il seguente codice:

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

+1 per questa soluzione compatta e autoesplicativa. Vale la pena notare che funziona anche per più di 2 elenchi:map(sum, zip(first, second, third, fourth, ...))
Johan Dettmar,

6

Il modo semplice e veloce per farlo è:

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

In alternativa, puoi usare la somma numpy:

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

1
Questo si generalizza bene con elenchi di elenchi più lunghi, che è proprio quello di cui avevo bisogno!
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

La mia risposta si ripete con quella di Thiru che rispose al 17 marzo alle 9:25.

È stato più semplice e veloce, ecco le sue soluzioni:

Il modo semplice e veloce per farlo è:

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

In alternativa, puoi usare la somma numpy:

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

Hai bisogno di intorpidimento!

l'array numpy potrebbe eseguire alcune operazioni come i vettori

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

Se si dispone di un numero sconosciuto di elenchi della stessa lunghezza, è possibile utilizzare la funzione seguente.

Qui * args accetta un numero variabile di argomenti dell'elenco (ma somma solo lo stesso numero di elementi in ciascuno). * Viene nuovamente utilizzato per decomprimere gli elementi in ciascuno degli elenchi.

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

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

sum_lists(a,b)

Produzione:

[2, 4, 6]

O con 3 liste

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

Produzione:

[19, 19, 19, 19, 19]

1

È possibile utilizzare zip(), che "interfoglia" i due array insieme, e quindi map(), che applica una funzione a ciascun elemento in un iterabile:

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

Ecco un altro modo per farlo. Facciamo uso della funzione interna __add__ di 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)

Produzione

[11, 22, 33, 44, 55]

1

Se vuoi aggiungere anche il resto dei valori negli elenchi puoi usarlo (questo funziona 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

Ecco un altro modo per farlo. Funziona bene per me.

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
Sebbene questo frammento di codice possa essere la soluzione, includere una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e quelle persone potrebbero non conoscere i motivi del tuo suggerimento sul codice.
Narendra Jadhav,

1

Forse l'approccio più semplice:

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

Se consideri i tuoi elenchi come array numpy, devi sommarli facilmente:

import numpy as np

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

print third

[7, 9, 11, 13, 15]

0

Che cosa succede se si dispone di un elenco con lunghezza diversa, quindi è possibile provare qualcosa di simile (utilizzando 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

Puoi usare questo metodo ma funzionerà solo se entrambi gli elenchi hanno le stesse dimensioni:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.