#python #algorithm #list #sorting
#python #алгоритм #Список #сортировка
Вопрос:
Работаем над реализацией этого алгоритма с использованием Python. Я думал, что моя логика в порядке, но, видимо, не так, как жалуется Python. Цикл while вызывает проблемы. Если я удалю это, он будет работать так, как ожидалось, но, очевидно, не сортирует весь список. Мой мыслительный процесс -> Использовать линейный поиск, чтобы найти наименьшее число -> Добавить это новое число в список -> Удалить это число из текущего списка -> Снова перебрать тот же список (но с удалением наименьшего числа) -> Повторять процесс, пока мы не пройдем весь список «x» количество раз. «x» равно длине списка. Проблема, с которой, я думаю, я сталкиваюсь, заключается в том, что список никогда не обновляется каждый раз, когда я выполняю цикл for? Я продолжаю получать ошибку Line 21: ValueError: list.index(x): x not in list
. Даже если «x» находится в списке. Есть идеи относительно того, что я делаю неправильно?
"""
Selection sort algorithm.
"""
import random
ls = []
max_number = 10
while len(ls) < max_number:
ls.append(random.randint(1,101))
print ls
def selection_sort(items_to_sort):
smallest_number = items_to_sort[0]
current_number = 0
sorted_items = []
item_len = len(items_to_sort)
while item_len > 0:
for item in items_to_sort[:]:
if item < smallest_number:
smallest_number = item
items_to_sort.pop(items_to_sort.index(smallest_number))
sorted_items.append(smallest_number)
item_len -= 1
return sorted_items
print selection_sort(ls)
Ответ №1:
Похоже, вы не повторно инициализируете smallest_number
переменную, поэтому после первого выполнения вашего while
цикла вы ищете значение, меньшее, чем предыдущее значение, которое вы только pop
что отредактировали из списка.
Когда вы не находите значение, меньшее, чем предыдущее наименьшее значение, которого больше нет в списке, вы пытаетесь выполнить pop
то smallest_number
же самое, что и в предыдущей итерации while
цикла. Однако этого значения больше нет в items_to_sort
списке, поэтому вы получаете ValueError
Попробуйте переместить строку smallest_number = items_to_sort[0]
, чтобы она была первой строкой, выполняемой на каждой итерации вашего while
цикла.
Комментарии:
1. да, вы правы, если он не инициализирует smallst_number повторно, он никогда не сможет найти меньшее число, которое меньше последнего наименьшего числа…
Ответ №2:
После каждого цикла while вы должны назначить items_to_sort[0]
smallest_number
current_number = 0
sorted_items = []
item_len = len(items_to_sort)
while item_len > 0:
smallest_number = items_to_sort[0]
for item in items_to_sort[:]:
if item < smallest_number:
smallest_number = item
index=items_to_sort.index(smallest_number)
items_to_sort.pop(index)
print(items_to_sort)
sorted_items.append(smallest_number)
item_len -= 1
return sorted_items