← Все вопросы
Как повернуть (сдвинуть) список на k позиций?
11
Хочу циклически сдвинуть список вправо на k: из [1, 2, 3, 4, 5] при k=2 получить [4, 5, 1, 2, 3]. Как это сделать аккуратно, и что если k больше длины?
3 ответа
16
✓ Принятый ответ — помог автору
Через срезы, с k % n чтобы не падать при больших k:
def rotate_right(lst, k):
if not lst:
return lst
k %= len(lst)
return lst[-k:] + lst[:-k]
print(rotate_right([1, 2, 3, 4, 5], 2)) # [4, 5, 1, 2, 3]
k %= len(lst) обязателен: иначе при k, кратном длине, lst[-0:] даст весь список и результат поедет. Срезы создают новый список — исходный не меняется.
Жанна Осипова Ловушка с lst[-0:] == весь список укусила меня однажды на собесе · 20 месяцев назад
6
Если нужен сдвиг на месте и заодно влево/вправо — есть collections.deque с методом rotate(k): положительное k — вправо, отрицательное — влево. Очень удобно, если структура и так deque.
3
deque.rotate(k).
Ваш ответ
Войдите, чтобы ответить на вопрос.