2011-04-09 11 views
5

tengo pseudo-código como este:¿Cómo añadir tuplas con

if(b < a) 
    return (1,0)+foo(a-b,b) 

quiero escribir en Python. Pero, ¿puede Python agregar tuplas? ¿Cuál es la mejor manera de codificar algo así?

Respuesta

10

¿Desea agregar los elementos, o agregar las tuplas? Por pitón por defecto hace

(1,2)+(3,4) = (1,2,3,4) 

puede definir su propio como:

def myadd(x,y): 
    z = [] 
    for i in range(len(x)): 
     z.append(x[i]+y[i]) 
    return tuple(z) 

También, como @ de delnan comentario deja claro, esto es mejor escribir como

def myadd(xs,ys): 
    return tuple(x + y for x, y in izip(xs, ys)) 

o incluso más funcionalmente:

myadd = lambda xs,ys: tuple(x + y for x, y in izip(xs, ys)) 

Después, realice

if(b < a) return myadd((1,0),foo(a-b,b)) 
+4

'tupla (x + y para x, y en izip (xs, ys))'. – delnan

+0

exactamente, quiero hacer algo como 'myadd' esta es la mejor manera? – fpointbin

+0

Sí, y el comentario de delnan es más conciso. – highBandWidth

12

yo iría a

>>> map(sum, zip((1, 2), (3, 4))) 
[4, 6] 

o, de forma más natural:

>>> numpy.array((1, 2)) + numpy.array((3, 4)) 
array([4, 6]) 
+0

funciona, pero tener que importar numpy puede ser excesivo para códigos pequeños. – jitter

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

En contraste con la respuesta de gran ancho de banda, este enfoque requiere que el las tuplas tienen la misma longitud en Python 2.7 o anterior, en lugar de generar un TypeError. En Python 3, map es ligeramente diferente, por lo que el resultado es una tupla de sumas con una longitud igual a la más corta de a y b.

Si desea que el comportamiento de truncamiento en Python 2, puede reemplazar map con itertools.imap:

tuple(itertools.imap(operator.add, a, b)) 
+0

cavar el estilo pero requiere otra importación. – jitter

2

Si desea + sí para actuar de esta manera, se podría subclase tuple y anular la adición:

class mytup(tuple): 
    def __add__(self, other): 
     if len(self) != len(other): 
      return NotImplemented # or raise an error, whatever you prefer 
     else: 
      return mytup(x+y for x,y in izip(self,other)) 

Lo mismo vale para __sub__, __mul__, __div__, __gt__ (elementwise >) etc. Mor La información sobre estos operadores especiales se puede encontrar, p. here (numeric operations) y here (comparisions)

Todavía se puede añadir tuplas llamando la adición tupla original: tuple.__add__(a,b) en lugar de a+b. O defina una función append() en la nueva clase para hacer esto.