IndexError: list index out of range

Я создаю программу, чтобы упорядочивать список чисел.

Однако, программа возвращает меня:

IndexError: list index out of range

Это мой код:

number_list=[]

list_lenght=int(input("List lenght: "))

while len(number_list)<list_lenght:
    item=input("Enter new item to the list:")
    number_list.append(item)
    print(number_list)

print("That's your number list: ",number_list)

number_list_final=[]

def order_number_list(number_list):
    i=0
    i2=i+1
    while (i2)<=(len(number_list)):
        while number_list[i]<=number_list[i2]:
            i2=i2+1
        i=i2
        i2=i+1
    final_item=number_list[i]
    number_list_final.append(final_item)
    del number_list[i] 
    order_number_list(number_list)

order_number_list(number_list)
print(number_list_final)

Кто-то знает мотив?

0
задан 18.01.2017, 16:25
0 ответов

В этом фрагменте кода:

while i2 <= len(number_list):
    while number_list[i] <= number_list[i2]:
        i2 = i2+1

В первом while, i2 достигни в конце концов как стоимость индекса, который не существует. Ты должен менять условие, чтобы предотвращать последнюю стоимость.

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

Также, список, который ты перемещаешь как аргумент, изменяется в процессе теряя элементы по мере того, как ты делаешь del number_list[i]. Невосполнимо прибудет момент, в котором список будет пустым и который будет del произведите ошибку.

Предполагая, что ты захотел стать твоим собственным algorimo распорядка, не использовать возможности python как sorted, min ó max, все же позволь мне советовать тебе пару cosillas:

  • Никогда, никогда, никогда не используй такие внешние переменные как результат функции. Каждая функция была бы должна возвращать Ваш результат посредством return
  • Используй for нежели while чтобы пробегать список
  • Изменять список пока оно обработано обычно является причиной многочисленных ошибок. Список, который ты перемещаешь, чтобы упорядочивать, разрушен внутри функции, медля в длине и теряя элементы.

Поддерживая функцию как переиталик (который не был бы необходимым), возможное перенаписание было бы таким:

def order_number_list(number_list):

    if len(number_list) == 0:
        return number_list
    else:
        m = number_list[0]

        for i in range(1, len(number_list)):
            if m > number_list[i]:
                m = number_list[i]

        return [m] + order_number_list(number_list[1:])

number_list_final = order_number_list(number_list)   

Хотя без recursión он лучше:

def order_number_list(number_list):

    lst = number_list[:]  # copia de la lista

    for i in range(1, len(lst)):
        for j in range(i, len(lst)): 
            if lst[i] > lst[j]:
                lst[i], lst[j] = lst[j], lst[i]

    return lst
2
ответ дан 03.12.2019, 17:38
  • 1
    Он не мог бы попросить ответ má s заверши, большое спасибо. –  18.01.2017, 20:00
  • 2
    I прощает контраответ, но, в первом while , если бы он поместил (len (number_list)-1) он был бы правильным верно? Потому что я схватил " i2" alcanzarí в реальную стоимость. Olvidé что labels списков только прибывают в lenght-1 –  18.01.2017, 20:03
  • 3
    Así он. с len(number_list)-1 не darí в ошибку. –  18.01.2017, 23:27

на первый while метода order_number_list измени условие <= только из-за несовершеннолетнего.

то, что он перемещает, состоит в том, что ты обсуждаешь положение вне ранга списка с инструкцией number_list [i2]

1
ответ дан 03.12.2019, 17:38
  • 1
    Привет, и спасибо за ответ. Ошибка производит себе в следующей линии, а именно во втором while из метода order_number_list . И, я думаю, что ошибка не приходит из-за comparadores, но немного изюма со списком и Вашим рангом, который, оценив Ваши компоненты, дает ошибку. –  18.01.2017, 18:25

помни, что в Пайтоне договоренности начинают с индекса 0. Потом, например, эта договоренность: У [1,54,23,6] есть 4 элемента, но 1 находится в индексе 0, 54 в 1, 23 в 2 и 6 в 3. Потом, когда ты делаешь:

    while (i2)<=(len(number_list)): ...

Последняя стоимость i2 будет числом элементов списка (в нашем примере 4), однако мы знаем, что индекс 4 не существует! Так как он только прибывает в 3 (с 0).

Потом решение состоит в том, чтобы менять условие уже будьте из-за:

    while (i2) <= (len(number_list) - 1): ...

или из-за:

    while (i2) < (len(number_list)): ...

Я надеюсь помочь :)

0
ответ дан 03.12.2019, 17:38