Ajouter la somme des valeurs de deux listes dans la nouvelle liste

135

J'ai les deux listes suivantes:

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

Maintenant, je veux ajouter les éléments de ces deux listes dans une nouvelle liste.

la sortie doit être

third = [7,9,11,13,15]
pygaur
la source

Réponses:

212

La zipfonction est utile ici, utilisée avec une compréhension de liste.

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

Si vous avez une liste de listes (au lieu de seulement deux listes):

lists_of_lists = [[1, 2, 3], [4, 5, 6]]
[sum(x) for x in zip(*lists_of_lists)]
# -> [5, 7, 9]
à M
la source
1
juste curieux de savoir comment zip () gère si les longueurs de tableau sont différentes? c'est-à-dire que renvoie zip pour différentes longueurs de tableau et comment cela affecterait-il l'opération pour x + y
ealeon
7
@ealeon: Le "zipping" s'arrête lorsque l'itérable le plus court est épuisé. Donc, si la firstlongueur est 10 et la secondlongueur 6, le résultat de la compression des itérables sera de longueur 6.
tom
Je pense que c'est plus utile que les autres réponses car vous pouvez faire des choses utiles comme prendre une moyenne ou donner un poids différent à chaque élément du tableau et les combiner
seokhoonlee
Y a-t-il un moyen de faire cela lorsque vous ne connaissez pas le nombre de listes?
traggatmot
@traggatmot: >>> lists_of_lists = [[1, 2, 3], [4, 5, 6]] >>> [sum(x) for x in zip(*lists_of_lists)] [5, 7, 9]
tom
50

À partir de documents

import operator
list(map(operator.add, first,second))
Thai Tran
la source
2
vous vouliez dire: list (map (operator.add, first, second))
Ghanem
27

En supposant que les deux listes aet bont même longueur, vous n'avez pas besoin zip, numpy ou toute autre chose.

Python 2.x et 3.x:

[a[i]+b[i] for i in range(len(a))]
math
la source
cela semble plutôt bien, si nous devons calculer la liste de somme résultante pour plus de 2 listes
lazarus
25

Le comportement par défaut dans numpy est d'ajouter un composant

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

quelles sorties

array([7,9,11,13,15])
user3582790
la source
De loin la meilleure réponse
Ian
Cela devrait fonctionner, mais dans mes expériences, cela ne fonctionne pas ... Je ne sais pas pourquoi, mais numpy me semble une bibliothèque puissante et compliquée ...
decadenza
@decadenza Comment avez-vous fait l'expérience?
Ashfaq le
Salut @Ashfaq, plusieurs mois se sont écoulés et j'ai mieux appris la bibliothèque Numpy. Je me suis trompé dans la définition de np.array. Désolé.
decadenza
utilisez np.add (first, second) .tolist () pour obtenir le résultat dans une liste
talekeDskobeDa
11

Cela s'étend à n'importe quel nombre de listes:

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

Dans votre cas, myListOfListsserait[first, second]

inspecteurG4dget
la source
1
En êtes-vous sûr izip.from_iterable?
DSM
1
@DSM: putain! Je pense que je pensais chain. Mise à jour
inspectorG4dget
9

Essayez le code suivant:

first = [1, 2, 3, 4]
second = [2, 3, 4, 5]
third = map(sum, zip(first, second))
Maciej Puczkowski
la source
+1 pour cette solution compacte et explicite. Il convient de noter que cela fonctionne également pour plus de 2 listes:map(sum, zip(first, second, third, fourth, ...))
Johan Dettmar
6

Le moyen simple et rapide de le faire est:

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

Vous pouvez également utiliser numpy sum:

from numpy import sum
three = sum([first,second], axis=0) # array([7,9,11,13,15])
Thiru
la source
1
Cela se généralise bien à des listes de listes plus longues, ce dont j'avais besoin!
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
la source
3

solution monotouche

list(map(lambda x,y: x+y, a,b))
Homme de l'ombre
la source
2

Ma réponse est répétée avec celle de Thiru qui y a répondu le 17 mars à 9h25.

C'était plus simple et plus rapide, voici ses solutions:

Le moyen simple et rapide de le faire est:

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

Vous pouvez également utiliser numpy sum:

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

Vous avez besoin de numpy!

Le tableau numpy pourrait faire des opérations comme des vecteurs

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]
Pièce
la source
2

Si vous avez un nombre inconnu de listes de même longueur, vous pouvez utiliser la fonction ci-dessous.

Ici, le * args accepte un nombre variable d'arguments de liste (mais ne fait la somme que du même nombre d'éléments dans chacun). Le * est à nouveau utilisé pour décompresser les éléments de chacune des listes.

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

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

sum_lists(a,b)

Production:

[2, 4, 6]

Ou avec 3 listes

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

Production:

[19, 19, 19, 19, 19]
Aile
la source
1

Vous pouvez utiliser zip(), qui "entrelacera" les deux tableaux ensemble, puis map(), qui appliquera une fonction à chaque élément dans un itérable:

>>> 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
la source
1

Voici une autre façon de procéder. Nous utilisons la fonction interne __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)

Production

[11, 22, 33, 44, 55]
Stryker
la source
1

Si vous souhaitez ajouter également le reste des valeurs dans les listes, vous pouvez l'utiliser (cela fonctionne dans 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
la source
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
la source
1

Voici une autre façon de le faire. Cela fonctionne très bien pour moi.

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
la source
1
j = min(len(l1), len(l2))
l3 = [l1[i]+l2[i] for i in range(j)]
Vijay Kumar
la source
1
Bien que cet extrait de code puisse être la solution, inclure une explication contribue vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.
Narendra Jadhav
1

Peut-être l'approche la plus 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
la source
1

Si vous considérez vos listes comme un tableau numpy, vous devez les additionner facilement:

import numpy as np

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

print third

[7, 9, 11, 13, 15]
Radvin
la source
0

Que faire si vous avez une liste avec une longueur différente, alors vous pouvez essayer quelque chose comme ça (en utilisant 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
la source
-2

Vous pouvez utiliser cette méthode mais cela ne fonctionnera que si les deux listes sont de la même taille:

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
BonjourUni
la source