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


135

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

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

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

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

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

Ответы:


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


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

Безусловно, лучший ответ
Ян

Он должен работать, но в моих экспериментах это не так ... Я не знаю почему, но 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]


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

1
Это хорошо обобщается на более длинные списки списков, что мне и нужно!
Vectornaut



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]

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]

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

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]

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.