Ротация списка Python
Возможный дубликат:
Эффективный способ переместить список в python
Я хотел бы повернуть список Python произвольным числом элементов вправо или влево (последнее с отрицательным аргументом).
Что-то вроде этого:
>>> l = [1,2,3,4]
>>> l.rotate(0)
[1,2,3,4]
>>> l.rotate(1)
[4,1,2,3]
>>> l.rotate(-1)
[2,3,4,1]
>>> l.rotate(4)
[1,2,3,4]
Как это можно сделать?
Ответы
Ответ 1
def rotate(l, n):
return l[-n:] + l[:-n]
Более традиционное направление:
def rotate(l, n):
return l[n:] + l[:n]
Пример:
example_list = [1, 2, 3, 4, 5]
rotate(example_list, 2)
# [3, 4, 5, 1, 2]
Аргументы rotate
- это список и целое число, обозначающее сдвиг. Функция создает два новых списка с помощью slicing и возвращает объединение этих списков. Функция rotate
не изменяет список ввода.
Ответ 2
Если применимо, вы можете использовать collections.deque
в качестве решения:
import collections
d = collections.deque([1,2,3,4,5])
d.rotate(3)
print d
>>> deque([3, 4, 5, 1, 2])
В качестве бонуса я ожидаю, что он будет быстрее, чем встроенный список.
Ответ 3
Следующая функция будет вращать список l
, x
пробелов справа:
def rotate(l, x):
return l[-x:] + l[:-x]
Обратите внимание, что это будет возвращать только исходный список, если x
находится за пределами диапазона [-len(l), len(l)]
. Чтобы он работал для всех значений x
, используйте:
def rotate(li, x):
return li[-x % len(li):] + li[:-x % len(li)]
Ответ 4
>>> l=[1,2,3,4]
>>> l[1:]+l[:1]
[2, 3, 4, 1]
>>> l=[1,2,3,4]
>>> l[2:]+l[:2]
[3, 4, 1, 2]
>>> l[-1:]+l[:-1]
[4, 1, 2, 3]
Общий поворот n
влево (положительный y в вызове rotate
) или правый (отрицательный y), затем:
def rotate(l, y=1):
if len(l) == 0:
return l
y = y % len(l) # Why? this works for negative y
return l[y:] + l[:y]
Если вы хотите, чтобы направление вращения было таким же, как ваш пример, просто поверните y
во вращение.
def rotate(l, y=1):
if len(l) == 0:
return l
y = -y % len(l) # flip rotation direction
return l[y:] + l[:y]