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]

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]

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

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

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

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]


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

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

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]


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]

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]

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]

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]

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

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

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

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

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)

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]

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]

-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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.