2009-07-31 11 views
8

Ich habe eine ListeWerte bewegen, aber in einer Python-Liste zu bewahren, um

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

und will ihre Werte zu ‚bewegen‘, damit es in

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

und dem nächsten Schritt

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

Gibt es eine eingebaute Funktion in Python, um das zu tun?

Oder gibt es eine kürzere oder schönere als

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

Antwort

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

Dies ist teuer, obwohl, wie es um den Inhalt der gesamten Liste zu verschieben, aufweist, die O (n) ist. Eine bessere Wahl sein kann collections.deque zu verwenden, wenn es in Ihrer Version von Python zur Verfügung, die Objekte ermöglichen eingefügt und von beiden Enden in etwa O (1) Zeit entfernt werden:

>>> 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]) 

Beachten Sie auch, dass diese beiden Lösungen Dazu gehört das Ändern des ursprünglichen Sequenzobjekts, während deins eine neue Liste erstellt und sie a zuweist. Also, wenn wir haben:

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

Mit Ihrer Methode, c auf die ursprüngliche, nicht gedrehten Liste verweisen weiterhin, und mit meinen Methoden, wird es auf die aktualisierte beziehen, gedreht Liste/deque.

Verwandte Themen