Tambahkan SUM nilai dari dua DAFTAR ke dalam DAFTAR baru

135

Saya memiliki dua daftar berikut:

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

Sekarang saya ingin menambahkan item dari kedua daftar ini ke daftar baru.

output seharusnya

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

Jawaban:

210

The zipfungsi berguna di sini, digunakan dengan pemahaman daftar.

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

Jika Anda memiliki daftar daftar (bukan hanya dua daftar):

lists_of_lists = [[1, 2, 3], [4, 5, 6]]
[sum(x) for x in zip(*lists_of_lists)]
# -> [5, 7, 9]
tom
sumber
1
hanya ingin tahu bagaimana zip () menangani jika panjang array berbeda? yaitu apa yang dikembalikan zip untuk panjang array yang berbeda dan bagaimana pengaruhnya terhadap operasi untuk x + y
ealeon
7
@ealeon: "zip" berhenti ketika iterable terpendek habis. Jadi jika firstpanjangnya 10 dan secondpanjangnya 6, hasil zipping iterables akan menjadi panjang 6.
tom
Saya pikir ini lebih berguna daripada jawaban lain karena Anda dapat melakukan hal-hal yang berguna seperti mengambil rata-rata atau memberikan bobot yang berbeda untuk setiap elemen dalam array dan menggabungkannya
seokhoonlee
Apakah ada cara untuk melakukan ini ketika Anda tidak tahu jumlah daftar?
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

Dari dokumen

import operator
list(map(operator.add, first,second))
Thai Tran
sumber
2
Anda maksud: daftar (peta (operator.add, pertama, kedua))
Ghanem
27

Dengan asumsi kedua daftar adan bmemiliki panjang yang sama, Anda tidak perlu zip, numpy atau apapun.

Python 2.x dan 3.x:

[a[i]+b[i] for i in range(len(a))]
matematika
sumber
ini sepertinya cukup bagus, jika kita harus menghitung daftar jumlah yang dihasilkan untuk lebih dari 2 daftar
lazarus
25

Perilaku default di numpy adalah menambahkan componentwise

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

output yang mana

array([7,9,11,13,15])
pengguna3582790
sumber
Sejauh ini jawaban terbaik
Ian
Seharusnya berhasil, tetapi dalam percobaan saya itu tidak ... Saya tidak tahu mengapa, tapi bagi saya perpustakaan yang pekat dan rumit ...
decadenza
@decadenza Bagaimana Anda melakukan percobaan?
Ashfaq
Hai @Ashfaq, berbulan-bulan berlalu dan saya sudah belajar lebih baik di perpustakaan Numpy. Saya salah dalam definisi np.array. Maaf.
Decadenza
gunakan np.add (pertama, kedua) .tolist () untuk mendapatkan hasilnya dalam daftar
talekeDskobeDa
11

Ini meluas ke sejumlah daftar:

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

Dalam kasus Anda, myListOfListsakan menjadi[first, second]

inspectorG4dget
sumber
1
Anda yakin tentang itu izip.from_iterable?
DSM
1
@ DSM: sial! Saya pikir saya sedang memikirkan chain. Diperbarui
inspectorG4dget
9

Coba kode berikut:

first = [1, 2, 3, 4]
second = [2, 3, 4, 5]
third = map(sum, zip(first, second))
Maciej Puczkowski
sumber
+1 untuk solusi yang ringkas dan jelas ini. Perlu dicatat bahwa ini bekerja untuk lebih dari 2 daftar juga:map(sum, zip(first, second, third, fourth, ...))
Johan Dettmar
6

Cara mudah dan cepat untuk melakukan ini adalah:

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

Atau, Anda dapat menggunakan numpy sum:

from numpy import sum
three = sum([first,second], axis=0) # array([7,9,11,13,15])
Thiru
sumber
1
Ini digeneralisasikan dengan baik ke daftar daftar yang lebih panjang, yang memang saya butuhkan!
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
sumber
3

solusi satu-liner

list(map(lambda x,y: x+y, a,b))
Manusia bayangan
sumber
2

Jawaban saya diulangi dengan jawaban Thiru yang menjawabnya pada 17 Maret jam 9:25.

Lebih sederhana dan lebih cepat, inilah solusinya:

Cara mudah dan cepat untuk melakukan ini adalah:

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

Atau, Anda dapat menggunakan numpy sum:

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

Kamu butuh numpy!

array numpy bisa melakukan beberapa operasi seperti vektor

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]
Bagian
sumber
2

Jika Anda memiliki jumlah daftar yang tidak diketahui dengan panjang yang sama, Anda dapat menggunakan fungsi di bawah ini.

Di sini * args menerima sejumlah variabel daftar argumen (tetapi hanya menjumlahkan jumlah elemen yang sama di masing-masing). * Digunakan lagi untuk membongkar elemen dalam setiap daftar.

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

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

sum_lists(a,b)

Keluaran:

[2, 4, 6]

Atau dengan 3 daftar

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

Keluaran:

[19, 19, 19, 19, 19]
Sayap
sumber
1

Anda dapat menggunakan zip(), yang akan "interleave" dua array bersama-sama, dan kemudian map(), yang akan menerapkan fungsi ke setiap elemen di 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
sumber
1

Ini cara lain untuk melakukannya. Kami menggunakan fungsi __add__ internal dari 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)

Keluaran

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

Jika Anda ingin menambahkan juga sisa nilai dalam daftar Anda dapat menggunakan ini (ini berfungsi di 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
sumber
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
sumber
1

Ini cara lain untuk melakukannya. Ini bekerja dengan baik untuk saya.

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
sumber
1
j = min(len(l1), len(l2))
l3 = [l1[i]+l2[i] for i in range(j)]
Vijay Kumar
sumber
1
Sementara cuplikan kode ini mungkin solusinya, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda.
Narendra Jadhav
1

Mungkin pendekatan yang paling sederhana:

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

Jika Anda menganggap daftar Anda sebagai array numpy, maka Anda perlu menjumlahkannya dengan mudah:

import numpy as np

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

print third

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

Bagaimana jika Anda memiliki daftar dengan panjang yang berbeda, maka Anda dapat mencoba sesuatu seperti ini (menggunakan 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
sumber
-2

Anda dapat menggunakan metode ini tetapi hanya akan berfungsi jika kedua daftar memiliki ukuran yang sama:

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