Циклический сдвиг

Обновлено: 03.11.2025

Выполнить циклический сдвиг в списке целых чисел на указанное число шагов. Сдвиг также должен быть кольцевым, то есть элемент, вышедший за пределы списка, должен появляться с другого его конца.

Решение задачи на языке программирования Python

Циклический кольцевой сдвиг в списке на языке программирования Python
#
×

Для решения этой задачи можно воспользоваться следующими методами списка:

Пусть наша функция 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().