Operaciones de tupla de elementos de Python como sum

¿Hay alguna forma de conseguir que las operaciones de tupla en Python funcionen así?

>>> a = (1,2,3) >>> b = (3,2,1) >>> a + b (4,4,4) 

en lugar de:

 >>> a = (1,2,3) >>> b = (3,2,1) >>> a + b (1,2,3,3,2,1) 

Sé que funciona así porque los métodos __add__ y __mul__ están definidos para funcionar así. Entonces, ¿la única manera sería redefinirlos?

 import operator tuple(map(operator.add, a, b)) 

Usando todos los incorporados ..

 tuple(map(sum, zip(a, b))) 

Esta solución no requiere una importación:

 tuple(map(lambda x, y: x + y, tuple1, tuple2)) 

Algo así como las dos primeras respuestas combinadas, con un retoque al código de ironfroggy para que devuelva una tupla:

 import operator class stuple(tuple): def __add__(self, other): return self.__class__(map(operator.add, self, other)) # obviously leaving out checking lengths >>> a = stuple([1,2,3]) >>> b = stuple([3,2,1]) >>> a + b (4, 4, 4) 

Nota: usar self.__class__ lugar de stuple para facilitar la subclasificación.

 from numpy import * a = array( [1,2,3] ) b = array( [3,2,1] ) print a + b 

Da array([4,4,4]) .

Ver http://www.scipy.org/Tentative_NumPy_Tutorial

Se puede usar la comprensión del generador en lugar del mapa. La función de mapa integrada no es obsoleta, pero es menos legible para la mayoría de las personas que la comprensión de lista / generador / dictado, por lo que recomiendo no usar la función de mapa en general.

 tuple(p+q for p, q in zip(a, b)) 

Solución simple sin definición de clase que devuelve tuple

 import operator tuple(map(operator.add,a,b)) 

Toda la solución del generador. No estoy seguro sobre el rendimiento (itertools es rápido, sin embargo)

 import itertools tuple(x+y for x, y in itertools.izip(a,b)) 

Sí. Pero no puedes redefinir los tipos incorporados. Tienes que subclasificarlos:

 clase MyTuple (tupla):
     def __add __ (yo mismo, otro):
          si len (self)! = len (other):
              boost ValueError ("las longitudes de tupla no coinciden")
          devolver MyTuple (x + y para (x, y) en zip (self, other))

Incluso más simple y sin usar el mapa, puedes hacer eso

 >>> tuple(sum(i) for i in zip((1, 2, 3), (3, 2, 1))) (4, 4, 4) 

En caso de que alguien necesite promediar una lista de tuplas:

 import operator from functools import reduce tuple(reduce(lambda x, y: tuple(map(operator.add, x, y)),list_of_tuples))