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]

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]

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


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

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

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]


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

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

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]


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]

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]

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]

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]

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

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

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

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

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)

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]

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]

-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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.