Manera eficiente de rotar una lista en Python

Resuelto D R asked hace 14 años • 27 respuestas

¿Cuál es la forma más eficiente de rotar una lista en Python? Ahora mismo tengo algo como esto:

>>> def rotate(l, n):
...     return l[n:] + l[:n]
... 
>>> l = [1,2,3,4]
>>> rotate(l,1)
[2, 3, 4, 1]
>>> rotate(l,2)
[3, 4, 1, 2]
>>> rotate(l,0)
[1, 2, 3, 4]
>>> rotate(l,-1)
[4, 1, 2, 3]

¿Existe una mejor manera?

D R avatar Jan 28 '10 03:01 D R
Aceptado

A collections.dequeestá optimizado para tirar y empujar en ambos extremos. Incluso tienen un rotate()método dedicado.

from collections import deque
items = deque([1, 2])
items.append(3)        # deque == [1, 2, 3]
items.rotate(1)        # The deque is now: [3, 1, 2]
items.rotate(-1)       # Returns deque to original state: [1, 2, 3]
item = items.popleft() # deque == [2, 3]
Ignacio Vazquez-Abrams avatar Jan 27 '2010 20:01 Ignacio Vazquez-Abrams

¿Qué tal simplemente usar pop(0)?

list.pop([i])

Elimine el elemento en la posición dada en la lista y devuélvalo. Si no se especifica ningún índice, a.pop()elimina y devuelve el último elemento de la lista. (Los corchetes alrededor de en ila firma del método indican que el parámetro es opcional, no que deba escribir corchetes en esa posición. Verá esta notación con frecuencia en la Referencia de la biblioteca de Python).

Jamgold avatar Dec 05 '2011 20:12 Jamgold

Numpy puede hacer esto usando el rollcomando:

>>> import numpy
>>> a=numpy.arange(1,10) #Generate some data
>>> numpy.roll(a,1)
array([9, 1, 2, 3, 4, 5, 6, 7, 8])
>>> numpy.roll(a,-1)
array([2, 3, 4, 5, 6, 7, 8, 9, 1])
>>> numpy.roll(a,5)
array([5, 6, 7, 8, 9, 1, 2, 3, 4])
>>> numpy.roll(a,9)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
Richard avatar Oct 13 '2012 10:10 Richard