Добавление двух кортежей в элемент

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

До сих пор (a и b - кортежи), я

map(sum, zip(a, b))

Мой ожидаемый результат:

(a[0] + b[0], a[1] + b[1], ...)

И возможное взвешивание было бы дать вес 0,5 и b 0,5 или так далее. (Я пытаюсь принять средневзвешенное значение).

Какая работа прекрасна, но я хочу добавить вес, я не совсем уверен, как я это сделаю.

Спасибо

Ответ 1

Замените их, затем суммируйте каждый кортеж.

[sum(x) for x in zip(a,b)]

EDIT: Здесь лучше, хотя и более сложная версия, которая позволяет взвешивать.

from itertools import starmap, islice, izip

a = [1, 2, 3]
b = [3, 4, 5]
w = [0.5, 1.5] # weights => a*0.5 + b*1.5

products = [m for m in starmap(lambda i,j:i*j, [y for x in zip(a,b) for y in zip(x,w)])]

sums = [sum(x) for x in izip(*[islice(products, i, None, 2) for i in range(2)])]

print sums # should be [5.0, 7.0, 9.0]

Ответ 2

>>> a = (1, 2, 3)
>>> b = (4, 5, 6)
>>> def averageWeightedSum(args):
        return sum(args) / len(args)
>>> tuple(map(averageWeightedSum, zip(a, b)))
(2.5, 3.5, 4.5)

Альтернативой было бы сначала применить весы. Это также позволит вам иметь разные веса:

>>> from operator import mul
>>> weights = (0.3, 0.7)
>>> tuple(sum(map(mul, x, weights)) for x in zip(a, b))
(3.0999999999999996, 4.1, 5.1)
>>> weights = (0.5, 0.5)
>>> tuple(sum(map(mul, x, weights)) for x in zip(a, b))
(2.5, 3.5, 4.5)

Ответ 3

Если вы не против зависимости, вы можете использовать numpy для элементарных операций над массивами

>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> b = np.array([3, 4, 5])
>>> a + b
array([4, 6, 8])

Ответ 4

Возьмем формулу для взвешенной суммы одной пары координат и сформируем кортеж с итератором по каждой паре (обратите внимание на две переменные после for):

tuple(0.5*an + 0.5*bn for an, bn in zip(a, b))

Это упрощает и читает как однострочный. Конечно, если ваша "взвешенная сумма" является сложной функцией, вы сначала определяете ее как отдельную функцию.

Ответ 5

Если ваши кортежи содержат объекты str:

list(map(''.join, zip('abc', '123')))
# Returns ['a1', 'b2', 'c3']