Manera eficiente de rotar una lista en Python
¿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?
Aceptado
A collections.deque
está 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]
¿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 eni
la 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).
Numpy puede hacer esto usando el roll
comando:
>>> 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])