2009-01-31 11 views
73

¿Hay alguna forma de conseguir operaciones de tupla en Python para trabajar de esta manera:Python elemento a elemento como la suma

>>> 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 de esa manera debido a que la Los métodos __add__ y __mul__ están definidos para funcionar de esa manera. Entonces, ¿la única forma sería redefinirlos?

Respuesta

102
import operator 
tuple(map(operator.add, a, b)) 
+4

yo diría que este es el más solución pitonica. –

+2

Excepto que el mapa() está semideprobado. Consulte http://www.artima.com/weblogs/viewpost.jsp?thread=98196 para obtener un artículo de Guido donde se menciona cómo el mapa se escribe mejor como una lista de comprensión. –

+0

También explota si a & b no contiene el mismo número de elementos, o no es "Aditable" (por ejemplo: 'map (operator.add, (1,2), (" 3 "," 4 ")) ' –

3

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

 
class MyTuple(tuple): 
    def __add__(self, other): 
     if len(self) != len(other): 
      raise ValueError("tuple lengths don't match") 
     return MyTuple(x + y for (x, y) in zip(self, other)) 
+0

pero luego no puede usar la sintaxis de tupla. – airportyh

19

Una especie de combinación de las primeras dos respuestas, con un pellizco al código de ironfroggy de modo que devuelve 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: el uso de self.__class__ en lugar de stuple para aliviar subclassing.

78

Utilizando todos los muebles empotrados ..

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

Esta parece ser la respuesta más simple y superior. ¿Por qué no es aceptado? –

+15

es bueno, pero técnicamente no es lo que se solicita porque map devuelve una lista, no una tupla ... entonces: 'tuple (map (sum, zip (a, b))' – Ben

+3

La sintaxis es mística. –

15
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

+5

Esto funcionará, pero es un poco pesado importar numpy solo por un operación de adición simple. –

5

solución sencilla y sin definición de clase que devuelve tupla

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

Toda solución generador. No está seguro sobre el rendimiento (itertools es rápido, aunque)

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

Esta solución no requiere una importación:

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

Esta solución también es más rápida que la otra solución de una línea sin importación ('map (sum, zip (a, b))') – Air

7

comprensión generador podría ser utilizado en lugar del mapa. La función de mapa incorporada no está obsoleta, pero es menos legible para la mayoría de las personas que la comprensión de lista/generador/dict, por lo que recomendaría no utilizar la función de mapa en general.

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

aún más simple y sin necesidad de utilizar un mapa, que puede hacer que

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

En caso de que alguien necesita un promedio de una lista de tuplas:

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