← Все вопросы

Как повернуть (сдвинуть) список на k позиций?

Задан 21 месяц назад481 просмотров3 ответа
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).

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект