Agregue SUMA de valores de dos LISTAS en una nueva LISTA

135

Tengo las siguientes dos listas:

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

Ahora quiero agregar los elementos de ambas listas a una nueva lista.

la salida debe ser

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

Respuestas:

210

La zipfunción es útil aquí, se usa con una comprensión de lista.

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

Si tiene una lista de listas (en lugar de solo dos listas):

lists_of_lists = [[1, 2, 3], [4, 5, 6]]
[sum(x) for x in zip(*lists_of_lists)]
# -> [5, 7, 9]
tom
fuente
1
Es curioso cómo zip () maneja si la longitud de la matriz es diferente. es decir, qué devuelve zip para diferentes longitudes de matriz y cómo afectaría eso a la operación para x + y
ealeon
77
@ealeon: La "compresión" se detiene cuando se agota el iterable más corto. Entonces, si firstes longitud 10 y secondlongitud 6, el resultado de comprimir los iterables será la longitud 6.
tom
Creo que es más útil que otra respuesta primo que puede hacer cosas útiles como medio para llevar o dar un peso diferente a cada uno de los elementos de la matriz y combinarlos
seokhoonlee
¿Hay alguna manera de hacer esto cuando no sabes el número de listas?
traggatmot 03 de
@traggatmot: >>> lists_of_lists = [[1, 2, 3], [4, 5, 6]] >>> [sum(x) for x in zip(*lists_of_lists)] [5, 7, 9]
tom
49

De documentos

import operator
list(map(operator.add, first,second))
Thai Tran
fuente
2
querías decir: list (map (operator.add, first, second))
Ghanem
27

Suponiendo que ambas listas ay btienen la misma longitud, que no es necesario postal, numpy o cualquier otra cosa.

Python 2.xy 3.x:

[a[i]+b[i] for i in range(len(a))]
matemáticas
fuente
esto parece bastante bueno, si tenemos que calcular la lista de suma resultante para más de 2 listas
lazarus
25

El comportamiento predeterminado en numpy es agregar componentes

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

que salidas

array([7,9,11,13,15])
usuario3582790
fuente
Con mucho, la mejor respuesta
Ian
Debería funcionar, pero en mis experimentos no ... No sé por qué, pero numpy me parece una biblioteca poderosa y complicada ...
decadenza
@decadenza ¿Cómo hiciste el experimento?
Ashfaq
Hola @Ashfaq, pasaron muchos meses y aprendí mejor la biblioteca Numpy. Me equivoqué en la definición np.array. Lo siento.
decadenza el
use np.add (primer, segundo) .tolist () para obtener el resultado en una lista
talekeDskobeDa
11

Esto se extiende a cualquier número de listas:

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

En tu caso, myListOfListssería[first, second]

inspectorG4dget
fuente
1
¿Estás seguro izip.from_iterable?
DSM
1
@DSM: maldita sea! Creo que estaba pensando chain. Actualizado
inspectorG4dget
9

Prueba el siguiente código:

first = [1, 2, 3, 4]
second = [2, 3, 4, 5]
third = map(sum, zip(first, second))
Maciej Puczkowski
fuente
+1 para esta solución compacta y autoexplicativa. Vale la pena señalar que esto también funciona para más de 2 listas:map(sum, zip(first, second, third, fourth, ...))
Johan Dettmar
6

La manera fácil y rápida de hacer esto es:

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

Alternativamente, puedes usar una suma numpy:

from numpy import sum
three = sum([first,second], axis=0) # array([7,9,11,13,15])
Thiru
fuente
1
Esto se generaliza muy bien a listas de listas más largas, que es justo lo que necesitaba
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
fuente
3

solución de una línea

list(map(lambda x,y: x+y, a,b))
Hombre de la sombra
fuente
2

Mi respuesta se repite con la de Thiru que respondió el 17 de marzo a las 9:25.

Fue más simple y rápido, aquí están sus soluciones:

La manera fácil y rápida de hacer esto es:

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

Alternativamente, puedes usar una suma numpy:

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

Necesitas numpy!

matriz numpy podría hacer alguna operación como vectores

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]
Trozo
fuente
2

Si tiene un número desconocido de listas de la misma longitud, puede usar la siguiente función.

Aquí el * args acepta un número variable de argumentos de lista (pero solo suma el mismo número de elementos en cada uno). El * se utiliza nuevamente para descomprimir los elementos en cada una de las listas.

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

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

sum_lists(a,b)

Salida:

[2, 4, 6]

O con 3 listas

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

Salida:

[19, 19, 19, 19, 19]
Ala
fuente
1

Puede usar zip(), que "intercalará" las dos matrices juntas, y luego map(), que aplicará una función a cada elemento en un iterable:

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

Aquí hay otra forma de hacerlo. Hacemos uso de la función interna __add__ de 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)

Salida

[11, 22, 33, 44, 55]
Stryker
fuente
1

Si desea agregar también el resto de los valores en las listas, puede usar esto (esto está funcionando en 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
fuente
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
fuente
1

Aquí hay otra forma de hacerlo. Me está funcionando bien.

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
fuente
1
j = min(len(l1), len(l2))
l3 = [l1[i]+l2[i] for i in range(j)]
Vijay Kumar
fuente
1
Si bien este fragmento de código puede ser la solución, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código.
Narendra Jadhav
1

Quizás el enfoque más simple:

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

Si considera sus listas como una matriz numpy, entonces necesita sumarlas fácilmente:

import numpy as np

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

print third

[7, 9, 11, 13, 15]
Radvin
fuente
0

¿Qué pasa si tiene una lista con diferente longitud, entonces puede intentar algo como esto (usando 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
fuente
-2

Puede usar este método, pero solo funcionará si ambas listas son del mismo tamaño:

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