2012-04-18 86 views
36

Duplicar posible:
Traverse a list in reverse order in PythonCómo invertir tuplas en Python?

Es esto posible? No tiene que estar en su lugar, solo buscando una manera de invertir una tupla para poder repetirla al revés.

+4

¿Ha intentado utilizar 'reversed'? – Wes

+0

Hay muchos duplicados de esta pregunta, pero todos parecen estar preguntando sobre cadenas o listas en lugar de tuplas. La respuesta es la misma. Ejemplos: http://stackoverflow.com/questions/931092/reverse-a-string-in-python http://stackoverflow.com/questions/6827413/reverse-does-not-work-on-a-python-literal http://stackoverflow.com/questions/529424/traverse-a-list-in-reverse-order-in-python – agf

+1

Gracias, sí, no pude encontrar uno que diga exactamente cómo invertir las tuplas, pero entiendo a qué se refiere. –

Respuesta

87

Hay dos formas idiomáticas de hacer esto:

reversed(x) # returns an iterator 

o

x[::-1] # returns a new tuple 

Desde tuplas son inmutables, no hay forma de revertir una tupla en el lugar.


Editar: Basándose en comentario de @ lvc, el iterador devuelto por reversed sería equivalente a

def myreversed(seq): 
    for i in range(len(x) - 1, -1, -1): 
     yield seq[i] 

es decir, que se basa en la secuencia que tiene una longitud conocida para evitar tener que en realidad invertir la tupla

cuanto a que es más eficiente, i sospecharía que sería el seq[::-1] si está utilizando todos de la misma y la tupla es pequeño, y reversed cuando la tupla es grande, pero el rendimiento en Python es a menudo sorprendente, por lo ¡mídelo!

+0

Gracias, ¿cuál sería más rápido? ¿Suena como iterador itera bajo demanda? Si es así, ¿cómo lo hace de manera efectiva sin invertir la lista primero? ¿Se está invirtiendo cada vez que itera? –

+2

@JoanVenge 'reversed' utiliza el hecho de que' tuple's son secuencias para comenzar al final y trabajar hacia atrás, dando a cada elemento bajo demanda mientras se hace un seguimiento de dónde está. – lvc

+1

@JoanVenge ver mi edición (LVC ty, simplemente amplió su comentario) – tobyodavies

9

Puede usar la función integrada reversed.

>>> x = (1, 2, 3, 4) 
>>> y = reversed(x) 
>>> tuple(y) 
(4, 3, 2, 1) 

Si lo que desea es iterar sobre la tupla, sólo puede utilizar el iterador devuelto por reversed directamente sin necesidad de convertirlo en una tupla de nuevo.

>>> for k in reversed(x): 
...  print k, 
... 
4 3 2 1 
6

Similar a la forma en que podría revertir una lista, es decir, s [:: - 1]

In [20]: s = (1, 2, 3) 

In [21]: s[::-1] 
Out[21]: (3, 2, 1) 

y

In [24]: for i in s[::-1]: 
    ....:  print i 
    ....: 
3 
2 
1