Ошибка при попытке закодировать пользовательскую функцию сортировки - PullRequest
0 голосов
/ 26 января 2020

Я пытаюсь сделать пользовательскую сортированную функцию для целых чисел и чисел с плавающей точкой. В этом коде я сначала удалил дубликаты, а затем попытался использовать функцию pop, чтобы извлечь минимальное число из списка и добавить его в пустой список, чтобы каждое число было в правильном порядке. Тем не менее, когда я пытаюсь извлечь минимальное число из «aList», я получаю следующий результат:

line 15, in <module>
    sortedList.append(delDupes.pop(delDupes[test]))
IndexError: pop index out of range

, но если я заменю эту строку выше на sortedList.append (test), то я Я получаю эту ошибку:

line 14, in <module>
    test = delDupes.index(min(delDupes))
ValueError: min() arg is an empty sequence

Вот как выглядит код:

aList = [30, 30, 30, 20, 20, 20, 25, 25, 25, 10, 10, 10, 50, 50, 50]

delDupes = []
sortedList = []

for i in aList:
    if i not in delDupes:
        delDupes.append(i)

adLoop = True


while adLoop:
    test = delDupes.index(min(delDupes))
    sortedList.append(delDupes.pop(delDupes[test]))
    if len(sortedList) != delDupes:
        adLoop = True
    else:
        adLoop = False

print(sortedList)

Я использую в то время как l oop, так что, как только выскочит минимальное число, l oop должен начаться снова и вытолкнуть следующее минимальное число, пока длина sortedList не станет такой же, как исходная длина delDupes

Ответы [ 2 ]

2 голосов
/ 26 января 2020

Вы получаете эту ошибку, потому что в этой строке

sortedList.append(delDupes.pop(delDupes[test]))

pop ожидайте индекс элемента, где вы предоставляете значение delDuples по индексу test

Здесь рабочий код:

aList = [30, 30, 30, 20, 20, 20, 25, 25, 25, 10, 10, 10, 50, 50, 50]

delDupes = []
sortedList = []

for i in aList:
    if i not in delDupes:
        delDupes.append(i)

adLoop = True


while adLoop:
    if delDupes:
        test = delDupes.index(min(delDupes))
    else:
        break
    try:
        sortedList.append(delDupes.pop(delDupes.index(delDupes[test])))
    except:
        x = 10
    if len(sortedList) != delDupes:
        adLoop = True
    else:
        adLoop = False

print (sortedList)

В результате: [10, 20, 25, 30, 50]

UPD: как Ch3steR упоминается в комментариях Вам будет полезно узнать, как это можно сделать более эффективным и простым способом:

sorted(set(aList))
1 голос
/ 26 января 2020

Есть две проблемы:

  1. Как отмечает @Carcigenicate, оно должно быть delDupes.pop(test), а не delDupes.pop(delDupes[test])
  2. Когда вы выталкиваете предметы из delDupes, оно становится меньше с ростом sortedList условие len(sortedList) != delDupes должно быть len(delDupes) != 0

Исправленный код (с минимальными изменениями) выглядит следующим образом:

aList = [30, 30, 30, 20, 20, 20, 25, 25, 25, 10, 10, 10, 50, 50, 50]

delDupes = []
sortedList = []

for i in aList:
    if i not in delDupes:
        delDupes.append(i)

adLoop = True


while adLoop:
    test = delDupes.index(min(delDupes))
    sortedList.append(delDupes.pop(test))
    if len(delDupes) != 0:
        adLoop = True
    else:
        adLoop = False

print(sortedList)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...