2009-07-31 9 views
8

Ho una listaMoving valori, ma mantenere l'ordine in una lista Python

a=[1,2,3,4,5] 

e desidera 'Move' i suoi valori in modo che si trasforma in

a=[2,3,4,5,1] 

e il prossimo passo

a=[3,4,5,1,2] 

Esiste una funzione incorporata in Python per farlo?

O c'è un modo più breve o più bello di

b=[a[-1]]; b.extend(a[:-1]); a=b 

risposta

25
>>> a = [1,2,3,4,5] 
>>> a.append(a.pop(0)) 
>>> a 
[2, 3, 4, 5, 1] 

Questo è costoso, anche se, come ha di spostare i contenuti dell'intera lista, che è O (n). Una scelta migliore potrebbe essere quella di utilizzare collections.deque se è disponibile nella versione di Python, che permettono di oggetti da inserire e rimossi da entrambe le estremità in circa O (1) tempo:

>>> a = collections.deque([1,2,3,4,5]) 
>>> a 
deque([1, 2, 3, 4, 5]) 
>>> a.rotate(-1) 
>>> a 
deque([2, 3, 4, 5, 1]) 

noti inoltre che entrambe queste soluzioni implica la modifica dell'oggetto sequenza originale, mentre il tuo crea un nuovo elenco e lo assegna a a. Quindi, se abbiamo fatto:

>>> c = a 
>>> # rotate a 

Con il vostro metodo, c avrebbero continuato a fare riferimento alla lista originale, non ruotata, e con i miei metodi, si riferiscono alla aggiornato, ruotato lista/deque.

Problemi correlati