Первое, отметим, что в вашем фрагменте кода:
min_num = min(num_list[i:]) #finds minimum number in list to the right of i
if min_num>num_list[i]:
min_num = num_list[i]
завещанию if
никогда, никогда не матч - поскольку min_num
является минимальным под-списком, начинающимся с num_list[i]
, он ни при каких обстоятельствах не может быть, е больше, чем последнее.
Итак, проиграйте последние два из этих трех утверждений - они примерно так же полезны, как проверка if 2+2 != 4:
:-).
Далее, заметим, что вы действительно не хотите min_num
быть значение (который является то, что ваш призыв к min
дает вам) - Вы хотите, чтобы это было индекс в список, для того, выполнить обмен:
num_list[i], num_list[min_num] = num_list[min_num], num_list[i]
Но попытка превратить значение в индекс с помощью метода index
довольно ненадежный путь: если список ввода может иметь любые дубликаты, index
всегда найдет первый из них, и это вполне может запутать вас. Я бы лично решил не ходить туда.
скорее рассмотреть более прямой путь нахождения минимального индекса с использованием соответствующего значения через key=
особенности min
! То есть:
for i in range(0,len_num_list):
min_ind = min(range(i, len_num_list),
key=lambda j: num_list[j])
num_list[i], num_list[min_ind] = num_list[min_ind], num_list[i]
print num_list
Если вы не знакомы с key=
особенностью многих Python встроенных модулей (min
, max
, sorted
, ...), это действительно хорошая вещь, чтобы учиться.
Сортирует (или дает минимальную или максимальную или) определенную последовательность, при этом сравнения выполняются после прохождения каждого элемента последовательности через «функцию извлечения ключа», которую вы передаете как key=
. Здесь вы хотите «индекс минимума», и вы получите это, выбрав индекс min с key=
соответствующего поиска каждого индекса в списке.
Я лично не нравится лямбда и может использовать key=numlist.__getitem__
, но это не очень считываемый - наиболее читаемый всегда использовать def
(и я бы сделал то же самое для этой функциональности подкачки), например ..:
def item_in_list(index): return num_list[index]
def swap(i, j): num_list[i], num_list[j] = num_list[j], num_list[i]
for i in range(0,len_num_list):
min_ind = min(range(i, len_num_list), key=item_in_list)
swap(i, min_ind)
print num_list
, который я считаю самым читаемым и изящным подходом к этой задаче.