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

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

Пока (а и б - кортежи), у меня есть

map(sum, zip(a, b))

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

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

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

Это прекрасно работает, но скажу, что я хотел добавить взвешивание, яЯ не совсем уверен, как бы я это сделал.

Спасибо

 qwwqwwq14 мая 2013 г., 18:48
Вы можете определить свою собственную функцию, которая включает в себя взвешивание, вместо использованияsum
 JeromeJ04 июн. 2016 г., 21:25
 Martijn Pieters14 мая 2013 г., 18:47
И вместо того, чтобы простоsum(i) (или жеsum(aa, bb) в этом отношении), вы можете использоватьразные выражение для создания других элементов. Включая кортеж с суммой и другими значениями:(sum(aa, bb), aa / bb) например.
 James14 мая 2013 г., 18:51
Хорошо, но есть ли способ сделать это без использования другой функции? (Поскольку сумма должна быть по своей природе быстрее, потому что она переносит сложение до c-кода, верно?)
 Martijn Pieters14 мая 2013 г., 18:46
Выявляются обработка вашегоa а такжеb кортежи элемент мудрый. Вы также можете сделатьtuple(sum(aa, bb) for aa, bb in zip(a, b)) распаковать два элемента в отдельные переменные. Какой будет ваша весовая формула?
 Waleed Khan14 мая 2013 г., 18:54
Я полагаю, что у numpy есть добавление кортежей и, вероятно, средневзвешенные значения.
 msvalkon14 мая 2013 г., 18:46
Какие'Ваш ожидаемый результат тогда?

Ответы на вопрос(5)

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

те кортеж с итератором для каждой пары (обратите внимание на две переменные послеfor):

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

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

 alexis28 апр. 2016 г., 15:46
У меня нетЯ ничего не изменил - прочитайте вопрос. я понимаювы нравится ваше решение лучше, вымы ясно дали понять. (Смотрите также тыкатьответ, если выдействительно хочу использоватьsum для дополнения с весами.) De gustibus et coloribus ...
 Nawaz26 апр. 2016 г., 10:53
tuple(sum(x) for x in zip(a, b)) лучше ... и tuple(map(sum, zip(a, b))) еще лучше.
 Nawaz28 апр. 2016 г., 04:16
Теперь вы изменили вопрос. ;-) (так как "Давать обеим частям одинаковый вес - это чепуха не обязательно верно, где это не так, мое решение работает и кажется лучше: P).
 Nawaz26 апр. 2016 г., 17:07
Ооо .. Я не заметил вес. Но тогда первая форма все еще может работать как:tuple(0.5 * sum(x) for x in zip(a, b)), Он почти такой же, как у вас, просто он более функциональный (и, вероятно, тоже питонный).
 alexis26 апр. 2016 г., 16:50
@ Наваз, почему это лучше? Я говорю яsum() хуже. Если вы хотите взвешенную сумму,sum() бесполезно. Кроме того, этоэто дело вкуса, но я нахожуsum() более уместно, когда существует неопределенное количество слагаемых - вот оноВсегда добавляются два термина. Думаю, каждому свое, но незабыть, что взвешенная сумма является частью ОПвопрос
 alexis27 апр. 2016 г., 21:42
Вовсе нет, тыпропустил суть. Давать обеим частям одинаковый вес - это нонсенс, вы могли бы также разделить сумму на 2. ОП выбрал плохое "возможно взвешивание как пример. Лучше было бы0.7*a + 0.3*b, Но напишите свой собственный код, как вам нравится.
 Nawaz28 апр. 2016 г., 17:37
Пожалуйста, смотрите вещи в контексте. Если веса такие же, как вы использовали в своем ответе, то мое решение отлично работает (и этомилый а также: P). Теперь, сработает ли это или нет, если веса разные, тогда это совсем другой вопрос.
Решение Вопроса

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

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

РЕДАКТИРОВАТЬ : Вот'Лучшая, хотя и более сложная версия, которая позволяет взвешивать.

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]
 Chris Doggett14 мая 2013 г., 19:14
Да, так и есть. Я'Я работаю на весах, только что попался на работу.
 Crisfole14 мая 2013 г., 19:11
нет, потому что онмог заменить "сумма» с .8 * x [0] + .2 * x [1]
 squiguy14 мая 2013 г., 19:12
@ChristopherPfohl Ну конечно, но я думал, что это было отмечено в комментариях.
 squiguy14 мая 2013 г., 19:03
Isn»Это то, что он имеет только в форме списка?

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

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

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

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

Ваш ответ на вопрос