Thêm SUM giá trị của hai DANH SÁCH vào DANH SÁCH mới


135

Tôi có hai danh sách sau:

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

Bây giờ tôi muốn thêm các mục từ cả hai danh sách này vào một danh sách mới.

đầu ra nên

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

Câu trả lời:


210

Các zipchức năng là hữu ích ở đây, được sử dụng với một sự hiểu biết danh sách.

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

Nếu bạn có một danh sách các danh sách (thay vì chỉ hai danh sách):

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

1
chỉ tò mò làm thế nào zip () sẽ xử lý nếu độ dài mảng cho khác nhau? tức là zip trả về những gì cho các độ dài mảng khác nhau và điều đó sẽ ảnh hưởng đến hoạt động của x + y
ealeon

7
@ealeon: Việc "nén" dừng lại khi lần lặp ngắn nhất đã hết. Vì vậy, nếu firstlà chiều dài 10 và secondlà chiều dài 6, kết quả của việc nén các lần lặp sẽ là chiều dài 6.
tom

Tôi nghĩ nó hữu ích hơn các câu trả lời khác vì bạn có thể làm những việc hữu ích như lấy trung bình hoặc tăng trọng lượng khác nhau cho từng thành phần trong mảng và kết hợp chúng
seokhoonlee

Có cách nào để làm điều này khi bạn không biết số lượng danh sách?
traggatmot

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


27

Giả sử cả hai danh sách abcó cùng độ dài, bạn không cần zip, numpy hoặc bất cứ điều gì khác.

Python 2.x và 3.x:

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

điều này có vẻ khá tốt, nếu chúng ta phải tính toán danh sách tổng hợp cho hơn 2 danh sách
lazarus

25

Hành vi mặc định trong numpy là thêm thành phần

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

đầu ra nào

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

Cho đến nay câu trả lời tốt nhất
Ian

Nó nên hoạt động, nhưng trong các thí nghiệm của tôi thì không ... Tôi không biết tại sao, nhưng dường như numpy đối với tôi là một thư viện
phấn khích

@decadenza Bạn đã làm thí nghiệm như thế nào?
Ashfaq

Xin chào @Ashfaq, nhiều tháng trôi qua và tôi đã học tốt hơn thư viện Numpy. Tôi đã sai trong định nghĩa np.array. Lấy làm tiếc.
decadenza

sử dụng np.add (thứ nhất, thứ hai) .tolist () để nhận kết quả trong danh sách
talekeDskobeDa

11

Điều này mở rộng chính nó cho bất kỳ số lượng danh sách:

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

Trong trường hợp của bạn, myListOfListssẽ là[first, second]


1
Bạn có chắc chắn về izip.from_iterable?
DSM

1
@DSM: chết tiệt! Tôi nghĩ rằng tôi đã nghĩ đến chain. Đã cập nhật
InspectorG4dget

9

Hãy thử đoạn mã sau:

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

+1 cho giải pháp nhỏ gọn và tự giải thích này. Điều đáng chú ý là điều này cũng hoạt động cho hơn 2 danh sách:map(sum, zip(first, second, third, fourth, ...))
Johan Dettmar

6

Cách dễ dàng và nhanh chóng để làm điều này là:

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

Ngoài ra, bạn có thể sử dụng tổng numpy:

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

1
Điều này khái quát độc đáo cho danh sách dài hơn các danh sách, đó là những gì tôi cần!
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

Câu trả lời của tôi được lặp lại với Thiru đã trả lời nó vào ngày 17 tháng 3 lúc 9:25.

Nó đơn giản và nhanh chóng hơn, đây là những giải pháp của anh ấy:

Cách dễ dàng và nhanh chóng để làm điều này là:

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

Ngoài ra, bạn có thể sử dụng tổng numpy:

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

Bạn cần numpy!

mảng numpy có thể làm một số hoạt động như vectơ

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

Nếu bạn có một số lượng danh sách không xác định có cùng độ dài, bạn có thể sử dụng chức năng dưới đây.

Ở đây, * args chấp nhận một số lượng đối số danh sách khác nhau (nhưng chỉ tính tổng số phần tử giống nhau trong mỗi phần tử). * Được sử dụng lại để giải nén các thành phần trong mỗi danh sách.

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

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

sum_lists(a,b)

Đầu ra:

[2, 4, 6]

Hoặc với 3 danh sách

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

Đầu ra:

[19, 19, 19, 19, 19]

1

Bạn có thể sử dụng zip(), nó sẽ "xen kẽ" hai mảng với nhau, và sau đó map(), sẽ áp dụng một hàm cho mỗi phần tử trong một lần lặp:

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

Đây là một cách khác để làm điều đó. Chúng tôi sử dụng chức năng __add__ nội bộ của 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)

Đầu ra

[11, 22, 33, 44, 55]

1

Nếu bạn muốn thêm cả các giá trị còn lại trong danh sách, bạn có thể sử dụng giá trị này (điều này đang hoạt động trong 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

Đây là một cách khác để làm điều đó. Nó hoạt động tốt với tôi.

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
Mặc dù đoạn mã này có thể là giải pháp, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
Narendra Jadhav

1

Có lẽ cách tiếp cận đơn giản nhất:

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

Nếu bạn coi danh sách của mình là mảng numpy, thì bạn cần dễ dàng tính tổng chúng:

import numpy as np

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

print third

[7, 9, 11, 13, 15]

0

Điều gì sẽ xảy ra nếu bạn có danh sách với độ dài khác nhau, sau đó bạn có thể thử một cái gì đó như thế này (sử dụng 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

Bạn có thể sử dụng phương pháp này nhưng nó sẽ chỉ hoạt động nếu cả hai danh sách có cùng kích thước:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.