Добавить СУММУ значений двух СПИСОК в новый СПИСОК

135

У меня есть два следующих списка:

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

Теперь я хочу добавить элементы из обоих этих списков в новый список.

вывод должен быть

third = [7,9,11,13,15]
pygaur
источник

Ответы:

212

zipФункция полезна здесь, используется со списком понимания.

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

Если у вас есть список списков (а не два списка):

lists_of_lists = [[1, 2, 3], [4, 5, 6]]
[sum(x) for x in zip(*lists_of_lists)]
# -> [5, 7, 9]
Том
источник
1
просто любопытно, как zip () будет обрабатывать, если длины массивов разные? то есть, что возвращает zip для массивов разной длины и как это повлияет на операцию для x + y
ealeon
7
@ealeon: «Архивирование» останавливается, когда исчерпывается самый короткий итерационный объект. Таким образом, если firstдлина 10 и secondдлина 6, результат сжатия итераций будет длиной 6.
Том
Я думаю, что это более полезно, чем другой ответ, потому что вы можете делать полезные вещи, например, брать среднее значение или придавать разный вес каждому
элементу
Есть ли способ сделать это, если вы не знаете количество списков?
traggatmot 03
@traggatmot: >>> lists_of_lists = [[1, 2, 3], [4, 5, 6]] >>> [sum(x) for x in zip(*lists_of_lists)] [5, 7, 9]
tom
50

Из документов

import operator
list(map(operator.add, first,second))
Тайский тран
источник
2
вы имели в виду: list (map (operator.add, first, second))
Ганем
27

Предполагая, что оба списка aиb имеют одинаковую длину, вам не нужно ZIP, NumPy или что - нибудь еще.

Python 2.x и 3.x:

[a[i]+b[i] for i in range(len(a))]
математический
источник
это кажется довольно хорошим, если нам нужно вычислить итоговый список сумм для более чем двух списков
lazarus
25

Поведение по умолчанию в numpy добавляется покомпонентно

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

который выводит

array([7,9,11,13,15])
user3582790
источник
Безусловно, лучший ответ
Ян
Он должен работать, но в моих экспериментах это не так ... Я не знаю почему, но numpy кажется мне мощной библиотекой, а также сложной ...
decadenza
@decadenza Как вы проводили эксперимент?
Ashfaq
Привет @Ashfaq, прошло много месяцев, и я лучше изучил библиотеку Numpy. Я ошибся в определении np.array. Сожалею.
decadenza
используйте np.add (first, second) .tolist (), чтобы получить результат в виде списка
TalekeDskobeDa
11

Это распространяется на любое количество списков:

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

В вашем случае myListOfListsбыло бы[first, second]

inspectorG4dget
источник
1
Вы уверены izip.from_iterable?
DSM
1
@DSM: черт возьми! Думаю, я думал об этом chain. Обновлено
InspectorG4dget
9

Попробуйте следующий код:

first = [1, 2, 3, 4]
second = [2, 3, 4, 5]
third = map(sum, zip(first, second))
Мацей Пучковски
источник
+1 за это компактное и понятное решение. Стоит отметить, что это работает и более чем для 2-х списков:map(sum, zip(first, second, third, fourth, ...))
Йохан Деттмар
6

Самый простой и быстрый способ сделать это:

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

В качестве альтернативы вы можете использовать numpy sum:

from numpy import sum
three = sum([first,second], axis=0) # array([7,9,11,13,15])
Thiru
источник
1
Это хорошо обобщается на более длинные списки списков, что мне и нужно!
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]
Анураг Мишра
источник
3

однострочное решение

list(map(lambda x,y: x+y, a,b))
Shadowman
источник
2

Мой ответ повторяется с Тиру, который ответил на него 17 марта в 9:25.

Это было проще и быстрее, вот его решения:

Самый простой и быстрый способ сделать это:

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

В качестве альтернативы вы можете использовать numpy sum:

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

Вам нужен numpy!

массив numpy может выполнять некоторые операции, такие как векторы

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

Если у вас есть неизвестное количество списков одинаковой длины, вы можете использовать следующую функцию.

Здесь * args принимает переменное количество аргументов списка (но суммирует только одинаковое количество элементов в каждом). Символ * снова используется для распаковки элементов в каждом из списков.

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

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

sum_lists(a,b)

Вывод:

[2, 4, 6]

Или с 3 списками

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

Вывод:

[19, 19, 19, 19, 19]
Крыло
источник
1

Вы можете использовать zip(), который будет «чередовать» два массива вместе, а затем map()применить функцию к каждому элементу в итерации:

>>> 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
источник
1

Вот еще один способ сделать это. Мы используем внутреннюю функцию __add__ 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)

Вывод

[11, 22, 33, 44, 55]
Stryker
источник
1

Если вы хотите добавить также остальные значения в списки, вы можете использовать это (это работает в 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
источник
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

Вот еще один способ сделать это. У меня он отлично работает.

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
Хотя этот фрагмент кода может быть решением, включение пояснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
Narendra Jadhav
1

Пожалуй, самый простой подход:

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

Если вы рассматриваете свои списки как массив numpy, вам нужно легко их суммировать:

import numpy as np

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

print third

[7, 9, 11, 13, 15]
Radvin
источник
0

Что делать, если у вас есть список разной длины, вы можете попробовать что-то вроде этого (используя 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

Вы можете использовать этот метод, но он будет работать, только если оба списка имеют одинаковый размер:

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
HelloUni
источник