2010-08-06 13 views
8

La pregunta es un poco engañosa, porque una tupla es inmutable. Lo que quiero es:Python: cómo cambiar (último) elemento de tupla?

Tener una tupla a = (1, 2, 3, 4) obtener una tupla b que es exactamente igual que a excepto para el último argumento que es, digamos, dos veces el último elemento de a.

=> b == (1, 2, 3, 8)

+3

Si puede evitarlo, considere usar una lista si va a realizar una manipulación in situ de los elementos. – user37078

+0

Creo que tiene más sentido usar tuplas en mi escenario - Necesito representar las versiones del programa, en el formato 'major.minor.branch.build -> (major, minor, branch, build)' y necesito obtener la versión de 'compilación anterior' de una versión dada –

+0

También puede usar la clase 'distutils.version.StrictVersion' para obtener los números de versión. – SiggyF

Respuesta

19
b = a[:-1] + (a[-1]*2,) 

Lo que estoy haciendo aquí es la concatenación de dos tuplas, la primera que contiene todo, pero el último elemento, y una nueva tupla que contiene la mutación del elemento final. El resultado es una nueva tupla que contiene lo que quieres.

Tenga en cuenta que para que + devuelva una tupla, ambos operandos deben ser una tupla.

+2

¿Qué tal '(a [-1] * 2,)'? Lo anterior arroja un TypeError. (la coma final es necesaria para una tupla de un elemento) – Skilldrick

+0

@Skilldrick gracias, editado – Ivo

6

Me gustaría hacer algo como:

b=list(a) 
b[-1]*=2 
b=tuple(b) 
+1

+1: esto es bastante legible y flexible. – EOL

5

Ésta es una forma de hacerlo:

>>> a = (1, 2, 3, 4) 
>>> b = a[:-1] + (a[-1]*2,) 
>>> a 
(1, 2, 3, 4) 
>>> b 
(1, 2, 3, 8) 

Entonces, ¿qué sucede en la segunda línea? a [: - 1] significa todo excepto el último elemento. a [-1] es el último elemento, y lo multiplicamos por dos. El (a [-1] * 2) convierte el resultado en una tupla y la tupla en rodajas se concatena con el operador +. El resultado se pone en b.

Probablemente pueda caber esto en su caso específico.

Cuestiones relacionadas