Подтвердить что ты не робот

Ротация списка 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]

Как это можно сделать?

4b9b3361

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