Нахождение суммы совпадающих компонентов в двух списках - PullRequest
4 голосов
/ 31 октября 2011

У меня есть два списка:

A = [1, 2, 3, 4, 5]
B = [6, 7, 8, 9, 10]

И мне нужно найти сумму n-х терминов из обоих списков, то есть 1 + 6, 2 + 7, 3 + 8 и т. Д.

Может, кто-нибудь подскажет, как ссылаться на элементы в обоих списках одновременно?

Я где-то читал, что могу сделать Sum = a [i] + b [i], но я не уверен, как это будет работать.

Ответы [ 5 ]

15 голосов
/ 31 октября 2011
>>> import operator
>>> map(operator.add, A, B)
[7, 9, 11, 13, 15]

только для демонстрации элегантности Питона: -)

13 голосов
/ 31 октября 2011

Используйте понимание списка и zip:

[a + b for (a,b) in zip(A,B)]

Являются ли эти вопросы домашними заданиями? Или самостоятельная работа?

0 голосов
/ 16 августа 2014

Привет. Вы тоже можете попробовать это:

>>>a=[1,2,3,4,5]
>>>b=[6,7,8,9,10]
>>>c=[]
>>>for i in range(0,5):
    c.append(a[i]+b[i])
>>> c
[7, 9, 11, 13, 15]
0 голосов
/ 17 марта 2013

Хотя решение Jazz работает для 2 списков, что если у вас более 2 списков?Вот решение:

def apply_elementwise_function(elements_in_iterables, function):
    elementwise_function = lambda x, y: itertools.imap(function, itertools.izip(x, y))
    return reduce(elementwise_function, elements_in_iterables)

a = b = c = [1, 2, 3]
>>> list(apply_elementwise_function([a, b, c], sum))
[3, 6, 9]
0 голосов
/ 31 октября 2011

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

AB = [A[i] + B[i] for i in range(len(A))]

В Python 2 вы можете использовать xrange вместо range, если ваши списки довольнобольшой.Я думаю, что это явный, простой, читаемый, очевидный способ сделать это, но некоторые могут отличаться.

Если списки могут быть разной длины, вам нужно решить, как вы хотите обрабатыватьлишние элементы.Допустим, вы хотите игнорировать дополнительные элементы того списка, который длиннее.Вот три способа сделать это:

AB = [A[i] + B[i] for i in range(min(len(A), len(B)))]

AB = map(sum, zip(A, B))

AB = [a + b for a, b in zip(A, B)]

Недостатком использования zip является то, что он будет выделять список кортежей, который может занимать много памяти, если ваши списки уже велики.Использование for i in xrange с подпиской не выделит всю эту память, или вы можете использовать itertools.izip:

import itertools
AB = map(sum, itertools.izip(A, B))

Если вместо этого вы хотите сделать вид, что более короткий список заполнен нулями, использование itertools.izip_longest - этократчайший ответ:

import itertools
AB = map(sum, itertools.izip_longest(A, B, fillvalue=0))

или

import itertools
AB = [a + b for a, b in itertools.izip_longest(A, B, fillvalue=0)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...