2010-09-27 4 views
5

Как получить попарно сумму двух одинаковых кортежей длины? Например, если у меня есть (0, -1,7) и (3,4, -7), я бы хотел (3,3,0) ответить.Как я могу суммировать два одинаковых кортежа

+3

Дубликат вопрос задал полтора года назад, который не получал никаких хороших ответов, кажется, хорошо. Все ответы на них основаны на картах, что намного менее чисто, чем выражение для понимания/генерации списка (см. Ниже). Принятый ответ в этом намного хуже - переопределение класса просто для выполнения метода на нем не имеет никакого смысла. –

+0

Я предполагаю, что причина для принятого ответа в том, что это то, что именно странное поведение задал вопрос, так что это не ошибка администратора. –

ответ

11
tuple(map(lambda (x, y): x + y, zip((0,-1,7), (3,4,-7)))) 

Если вы предпочитаете, чтобы избежать map и lambda, то вы можете сделать:

tuple(x + y for x,y in zip((0,-1,7), (3,4,-7))) 

EDIT: Как один из ответов отметил, вы можете использовать сумму вместо явного разделения кортежи возвращается по zip. Таким образом, вы можете переписать этот пример кода, как показано ниже:

tuple(sum(t) for t in zip((0,-1,7), (3,4,-7))) 

Ссылка: zip, map, sum.

+0

Обычно понимание списка предпочтительнее. Это гораздо более интуитивно понятное, чем все функциональные ответы в # 497885. –

+0

@ Гленн: согласился. Тем не менее, мне было легче сначала подумать с точки зрения карты и фильтра, а затем отобразить ее (нет каламбуров: P) для понимания списка. –

+0

Я наоборот: список понятий (в данном случае, генераторные выражения, на самом деле), естественно интуитивны для меня, но я должен думать о карте - возможно, потому, что он намного реже используется в Python. –

4
>>> t1 = (0,-1,7) 
>>> t2 = (3,4,-7) 
>>> tuple(i + j for i, j in zip(t1, t2)) 
(3, 3, 0) 
3

В качестве альтернативы (хорошо, если у вас есть очень большие кортежи или вы планируете делать другие математические операции с ними):

> import numpy as np 
> t1 = (0, -1, 7) 
> t2 = (3, 4, -7) 
> at1 = np.array(t1) 
> at2 = np.array(t2) 
> tuple(at1 + at2) 
(3, 3, 0) 

Минусы: требуется больше подготовки данных. В большинстве случаев может быть излишним.

Плюсы: операции очень явны и изолированы. Наверное, очень быстро с большими кортежами.

6

Использование сумма():

>>> tuple(sum(pair) for pair in zip((0,-1,7), (3,4,-7))) 

или

>>> tuple(map(sum, zip((0,-1,7), (3,4,-7)))) 
+0

'tuple (map (operator.add, (0, -1, 7), (3, 4, -7)))' –

Смежные вопросы