2012-04-18 2 views
36

Eventuali duplicati:
Traverse a list in reverse order in PythonCome invertire le tuple in Python?

è possibile? Non deve essere a posto, solo cercando un modo per invertire una tupla in modo da poterlo scorrere all'indietro.

+4

Hai provato a usare 'reversed'? – Wes

+0

Ci sono molti duplicati di questa domanda, ma tutti sembrano chiedersi di stringhe o elenchi di tuple. La risposta è la stessa. Esempi: 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

Grazie, sì, non riuscivo a trovarne uno che parla esattamente di invertire le tuple ma capisco cosa intendi. –

risposta

87

Ci sono due modi per farlo idiomatiche:

reversed(x) # returns an iterator 

o

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

Dal tuple sono immutabili, non v'è alcun modo per invertire una tupla sul posto.


Edit: Basandosi sul commento di @ LVC, l'iteratore restituito da reversed sarebbe equivalente a

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

cioè si basa sulla sequenza di lunghezza nota per evitare di dover effettivamente invertire la tupla.

Per quanto è più efficiente, sospetto che sarebbe lo seq[::-1] se si sta utilizzando tutto e la tupla è piccola, e reversed quando la tupla è grande, ma le prestazioni in python sono spesso sorprendenti quindi misuralo!

+0

Grazie, quale sarebbe più veloce? Sembra che iteratore iterazioni su richiesta? In caso affermativo, come lo fa in modo efficace senza invertire la lista prima? Sta invertendo ogni volta che itera? –

+2

@JoanVenge 'reverseed' usa il fatto che' tuple's sono sequenze che iniziano alla fine e lavorano all'indietro, dando ogni elemento su richiesta mentre si tiene traccia di dove si trova. – lvc

+1

@JoanVenge vedi la mia modifica (ty lvc, appena espanso il tuo commento) – tobyodavies

9

È possibile utilizzare la funzione integrata reversed.

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

Se si desidera solo per iterare la tupla, si può semplicemente utilizzare l'iteratore restituito da reversed direttamente senza convertirlo in una tupla di nuovo.

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

Simile al modo in cui si invertire una lista, cioè s [:: - 1]

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

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

e

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