Циклический сдвиг (Python)

Тема: 
Функции

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

Например, если дан список
[8, -2, 3, -4, 5]
, то его сдвиг до минимального в начале преобразует список так:
[-4, 5, 8, -2, 3]

Задача включает два основных этапа. Первый - найти индекс минимального элемента. Второй - выполнить сдвиг на количество шагов, равному найденному индексу.

В Python минимальный элемент можно найти с помощью встроенной в язык функции min(). Индекс найденного элемента можно определить с помощью встроенного метода для последовательностей index().

При "классическом" способе сдвига на один шаг влево на место каждого очередного элемента записывается следующий за ним. Это действие выполняется в цикле от первого элемента до предпоследнего, так как на предпоследнее место записывается последний элемент, а в последнее уже присваивать нечего. При этом первый элемент следует сохранить до цикла и присвоить его последней "ячейке" списка после цикла. При этом описанные действия надо выполнить то количество раз, на сколько шагов сдвигается список. (В программе ниже это 2-й вариант.)

Однако можно воспользоваться возможностью языка программирования Python, брать срезы последовательностей. Надо взять срез списка от минимального элемента до конца и присоединить к нему срез от начала до минимального (уже не включая минимальный).

from random import random
a = []
for i in range(15):
    a.append(int(random()*50)-25)
 
def print_list(lst,tab):
    s = "%"+str(tab) + "d"
    for i in lst:
        print(s % i, end='')
    print()
 
def shift(lst,steps): 
    """ Циклический кольцевой сдвиг списка до минимума"""
    lst = lst[steps:] + lst[:steps] # 1-й вариант
    #for i in range(steps): # 2-й вариант
        #b = lst[0]
        #for i in range(len(lst)-1): 
            #lst[i] = lst[i+1]
        #lst[len(lst)-1] = b
    return lst
 
print(shift.__doc__)
print_list(a,4)
b = min(a)
i = a.index(b)
a = shift(a,i)
print_list(a,4)

Пример выполнения программы:

Циклический кольцевой сдвиг списка до минимума
 -19  -1  -1 -10  -8  18 -23  21  -4 -24 -22 -10 -23 -21 -10
 -24 -22 -10 -23 -21 -10 -19  -1  -1 -10  -8  18 -23  21  -4