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í?
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í?
¿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))
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])
funciona, pero tener que importar numpy puede ser excesivo para códigos pequeños. – jitter
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))
cavar el estilo pero requiere otra importación. – jitter
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.
'tupla (x + y para x, y en izip (xs, ys))'. – delnan
exactamente, quiero hacer algo como 'myadd' esta es la mejor manera? – fpointbin
Sí, y el comentario de delnan es más conciso. – highBandWidth