Câu trả lời:
Các zip
chứ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]
first
là chiều dài 10 và second
là 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.
>>> lists_of_lists = [[1, 2, 3], [4, 5, 6]]
>>> [sum(x) for x in zip(*lists_of_lists)]
[5, 7, 9]
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])
Đ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, myListOfLists
sẽ là[first, second]
izip.from_iterable
?
chain
. Đã cập nhật
Hãy thử đoạn mã sau:
first = [1, 2, 3, 4]
second = [2, 3, 4, 5]
third = map(sum, zip(first, second))
map(sum, zip(first, second, third, fourth, ...))
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])
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]
giải pháp một lớp lót
list(map(lambda x,y: x+y, a,b))
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]
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]
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]
Đâ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]
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))
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]
Đâ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("")
j = min(len(l1), len(l2))
l3 = [l1[i]+l2[i] for i in range(j)]
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)
Đ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]
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