2010-08-06 28 views
8

La domanda è un po 'fuorviante, perché una tupla è immutabile. Quello che voglio è:Python: come cambiare (ultimo) elemento di tupla?

Avere una tupla a = (1, 2, 3, 4) ottenere una tupla b che è esattamente come a tranne che per l'ultimo argomento, che è, diciamo, due volte l'ultimo elemento di a.

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

+3

Se si può aiutare, considerare l'utilizzo di un elenco se si sta andando a fare la manipolazione sul posto di elementi. – user37078

+0

Penso che abbia più senso usare le tuple nel mio scenario - Devo rappresentare le versioni del programma, nel formato 'major.minor.branch.build -> (major, minor, branch, build)' e ho bisogno di ottenere la versione di 'build precedente' da una determinata versione –

+0

È anche possibile utilizzare la classe 'distutils.version.StrictVersion' per i numeri di versione. – SiggyF

risposta

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

Quello che sto facendo qui è la concatenazione di due tuple, la prima che contiene tutto, ma l'ultimo elemento, e una nuova tupla contenente la mutazione dell'elemento finale. Il risultato è una nuova tupla contenente ciò che desideri.

Si noti che per + per restituire una tupla, entrambi gli operandi devono essere una tupla.

+2

Che ne dici di '(a [-1] * 2,)'? Quanto sopra genera un errore TypeError. (la virgola finale è necessaria per una tupla di un articolo) – Skilldrick

+0

@Skilldrick grazie, modificato – Ivo

6

vorrei fare qualcosa di simile:

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

+1: questo è abbastanza leggibile e flessibile. – EOL

5

Ecco un modo per farlo:

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

Che cosa succede sulla seconda linea? a [: - 1] significa tutto a tranne l'ultimo elemento. a [-1] è l'ultimo elemento e lo si moltiplica per due. Il (a [-1] * 2,) trasforma il risultato in una tupla e la tupla tagliata viene concatenata con essa usando l'operatore +. Il risultato è messo in b.

Probabilmente è possibile adattarlo al caso specifico.