Yeni LİSTE'ye iki LİSTE değerlerinin TOPLAMINI ekleyin


134

Şu iki listem var:

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

Şimdi bu listelerin her ikisindeki öğeleri yeni bir listeye eklemek istiyorum.

çıktı olmalı

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

Yanıtlar:


211

zipİşlevi, bir liste anlayışı ile kullanıldığında, burada yararlıdır.

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

Bir liste listeniz varsa (sadece iki liste yerine):

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

1
dizi uzunlukları farklıysa zip () nasıl işler? Örneğin, farklı dizi uzunlukları için zip neyi döndürür ve bu x + y
ealeon

7
@ealeon: En kısa yinelenebilirlik bittiğinde "sıkıştırma" durur. Yani firstuzunluk 10 ve seconduzunluk 6 ise, yinelemeleri sıkıştırmanın sonucu 6 uzunluk olacaktır.
tom

Sanırım diğer cevaplardan daha faydalı çünkü ortalama almak veya dizideki her bir öğeye farklı ağırlık vermek ve bunları birleştirmek gibi yararlı şeyler yapabilirsiniz
seokhoonlee

Listelerin sayısını bilmediğinizde bunu yapmanın bir yolu var mı?
traggatmot

@traggatmot:>>> lists_of_lists = [[1, 2, 3], [4, 5, 6]] >>> [sum(x) for x in zip(*lists_of_lists)] [5, 7, 9]
tom

49

Gönderen docs

import operator
list(map(operator.add, first,second))

2
demek istediniz: list (harita (operator.add, birinci, ikinci))
Ghanem

26

Her iki listeyi varsayarsak ave baynı uzunlukta, zip, numpy veya başka bir şey gerekmez.

Python 2.x ve 3.x:

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

2'den fazla liste için sonuç toplam listesini hesaplamamız gerekiyorsa, bu oldukça iyi görünüyor
lazarus

24

Numpy'deki varsayılan davranış bileşen olarak eklenir

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

hangi çıktılar

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

Şimdiye kadarki en iyi cevap
Ian

Çalışmalı, ama deneylerimde işe yaramıyor ... Nedenini bilmiyorum ama uyuşukluk bana hem güçlü bir kütüphane hem de karmaşık bir kütüphane gibi görünüyor ...
decadenza

@decadenza Deneyi nasıl yaptınız?
Ashfaq

Merhaba @ Ashfaq, aylar geçti ve Numpy kütüphanesini daha iyi öğrendim. Np.array tanımında yanılmışım. Afedersiniz.
decadenza

sonucu bir listede almak için np.add (birinci, ikinci) .tolist () kullanın
talekeDskobeDa

11

Bu, herhangi bir sayıda listeye kadar uzanır:

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

Senin durumunda, myListOfListsolurdu[first, second]


1
Emin izip.from_iterablemisin?
DSM

1
@DSM: kahretsin! Sanırım düşünüyordum chain. Güncellenmiş
inspectorG4dget

9

Aşağıdaki kodu deneyin:

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

Bu kompakt ve kendinden açıklamalı çözüm için +1. Bunun 2'den fazla liste için de işe yaradığını belirtmekte fayda var:map(sum, zip(first, second, third, fourth, ...))
Johan Dettmar

6

Bunu yapmanın kolay ve hızlı yolu şudur:

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

Alternatif olarak, numpy sum kullanabilirsiniz:

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

1
Bu, daha uzun liste listelerine güzel bir şekilde genelleşiyor, tam da ihtiyacım olan şey buydu!
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

Cevabım 17 Mart'ta saat 9: 25'te cevaplayan Thiru ile tekrarlandı.

Daha basit ve daha hızlıydı, işte çözümleri:

Bunu yapmanın kolay ve hızlı yolu şudur:

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

Alternatif olarak, numpy sum kullanabilirsiniz:

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

Uyuşmaya ihtiyacın var!

numpy dizi vektörler gibi bazı işlemler yapabilir

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

Aynı uzunlukta bilinmeyen sayıda listeniz varsa, aşağıdaki işlevi kullanabilirsiniz.

Burada * args değişken sayıda liste bağımsız değişkenini kabul eder (ancak her birinde yalnızca aynı sayıda öğeyi toplar). *, Her bir listedeki öğelerin paketini açmak için yeniden kullanılır.

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

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

sum_lists(a,b)

Çıktı:

[2, 4, 6]

Veya 3 listeli

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

Çıktı:

[19, 19, 19, 19, 19]

1

Sen kullanabilirsiniz zip()sonra bir araya hangi edecek "Interleave" iki diziler, ve map()bir iterable her elemana bir işlevi uygular, hangi:

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

İşte bunu yapmanın başka bir yolu. Python'un dahili __add__ işlevini kullanıyoruz:

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)

Çıktı

[11, 22, 33, 44, 55]

1

Listelerdeki değerlerin geri kalanını da eklemek isterseniz bunu kullanabilirsiniz (bu Python3.5'te çalışıyor)

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

İşte bunu yapmanın başka bir yolu, benim için iyi çalışıyor.

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
Bu kod pasajı çözüm olabilir, ancak bir açıklama da dahil olmak üzere yayınınızın kalitesini artırmaya gerçekten yardımcı olur. Gelecekte okuyucular için soruyu yanıtladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceklerini unutmayın.
Narendra Jadhav

1

Belki de en basit yaklaşım:

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

Listelerinizi uyuşuk bir dizi olarak görürseniz, bunları kolayca toplamanız gerekir:

import numpy as np

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

print third

[7, 9, 11, 13, 15]

0

Ya farklı uzunlukta bir listeniz varsa, bunun gibi bir şey deneyebilirsiniz (kullanarak 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

Bu yöntemi kullanabilirsiniz, ancak yalnızca her iki liste de aynı boyuttaysa çalışacaktır:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.