Циклический сдвиг
Обновлено: 03.11.2025
Выполнить циклический сдвиг в списке целых чисел на указанное число шагов. Сдвиг также должен быть кольцевым, то есть элемент, вышедший за пределы списка, должен появляться с другого его конца.
Решение задачи на языке программирования Python
Для решения этой задачи можно воспользоваться следующими методами списка:
append— добавляет элемент в конец списка,insert— вставляет элемент по указанному индексу,pop— извлекает элемент с конца списка или, если был передан индекс, по индексу.
Пусть наша функция shift в качестве аргументов принимает список и количество шагов сдвига. Если шаги представлены положительным числом, то сдвиг выполняется вправо, то есть надо извлечь последний элемент и добавить его в начало.
Если шаги — отрицательное число, то будем выполнять сдвиг справа налево, то есть надо извлечь первый элемент и добавить его в конец.
def shift(lst, steps): if steps < 0: steps = abs(steps) for i in range(steps): lst.append(lst.pop(0)) else: for i in range(steps): lst.insert(0, lst.pop()) nums = [4, 5, 6, 7, 8, 9, 0] print(nums) shift(nums, -2) print(nums) shift(nums, 3) print(nums)
Результат выполнения:
[4, 5, 6, 7, 8, 9, 0] [6, 7, 8, 9, 0, 4, 5] [0, 4, 5, 6, 7, 8, 9]
В случае, если требуется отображать каждый шаг сдвига, программа может выглядеть так:
def shift(lst, steps): print('Original:', lst) if steps < 0: steps = abs(steps) for i in range(steps): lst.append(lst.pop(0)) print(f'Step {i+1}: ', lst) else: for i in range(steps): lst.insert(0, lst.pop()) print(f'Step {i + 1}: ', lst) nums = [4, 5, 6, 7, 8, 9, 0] shift(nums, -2) print() shift(nums, 3)
Original: [4, 5, 6, 7, 8, 9, 0] Step 1: [5, 6, 7, 8, 9, 0, 4] Step 2: [6, 7, 8, 9, 0, 4, 5] Original: [6, 7, 8, 9, 0, 4, 5] Step 1: [5, 6, 7, 8, 9, 0, 4] Step 2: [4, 5, 6, 7, 8, 9, 0] Step 3: [0, 4, 5, 6, 7, 8, 9]
Если при сдвиге не требуется выводить список после каждого шага, можно воспользоваться взятием срезов на языке Python:
letters = ['a', 'b', 'c', 'd', 'e', 'f'] print(letters) steps = int(input()) if steps > 0: # сдвиг направо (выбывшие с конца появятся в начале) letters = letters[-steps:] + letters[:(len(letters)-steps)] elif steps < 0: # сдвиг налево (выдавленные из начала появятся в конце) letters = letters[abs(steps):] + letters[:abs(steps)] print(letters)
Примеры выполнения:
['a', 'b', 'c', 'd', 'e', 'f'] 1 ['f', 'a', 'b', 'c', 'd', 'e']
['a', 'b', 'c', 'd', 'e', 'f'] -2 ['c', 'd', 'e', 'f', 'a', 'b']
Однако на самом деле здесь не происходит изменения имеющегося списка, а создается новый список из срезов-частей старого. Это можно увидеть воспользовавшись встроенной в Python функцией id().