Вопрос-Ответ

Efficient way to rotate a list in python

Эффективный способ поворота списка в python

Какой наиболее эффективный способ поворота списка в python? Прямо сейчас у меня есть что-то вроде этого:

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

Есть ли способ лучше?

Переведено автоматически
Ответ 1

A collections.deque оптимизирован для вытягивания и проталкивания с обоих концов. У них даже есть специальный rotate() метод.

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]
Ответ 2

Как насчет простого использования pop(0)?


list.pop([i])


Удалите элемент с заданной позиции в списке и верните его. Если индекс не указан, a.pop() удаляет и возвращает последний элемент в списке. (Квадратные скобки вокруг i в сигнатуре метода означают, что параметр является необязательным, а не то, что вы должны вводить квадратные скобки в этой позиции. Вы часто увидите это обозначение в справочнике по библиотеке Python.)


Ответ 3

Numpy может сделать это с помощью roll команды:

>>> 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])
Ответ 4

Это зависит от того, что вы хотите, чтобы происходило, когда вы это делаете:

>>> shift([1,2,3], 14)

Возможно, вы захотите изменить свой:

def shift(seq, n):
return seq[n:]+seq[:n]

Для:

def shift(seq, n):
n = n % len(seq)
return seq[n:] + seq[:n]
python list