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]

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]

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

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

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

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]


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

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

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]


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]

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]

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]

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]

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

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

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

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

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)

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]

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]

-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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.