Перезаписать функцию insert () - вывести индекс из списка за пределы диапазона - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь воссоздать версию функции insert() для домашнего задания. Я написал следующую функцию:

def insert_value(my_list, value, insert_position):
    list_copy = []

    if insert_position < 0:
        insert_position = 0

    if insert_position >= len(my_list):
        insert_position = len(my_list) - 1

    i = 0
    while i < len(my_list) + 1:
        while i < insert_position:
            list_copy.append(my_list[i])
            i += 1

        while i == insert_position:
            list_copy.append(value)
            i += 1

        while i > insert_position:
            list_copy.append(my_list[i-1])
            i += 1

    return list_copy

Я получаю ошибку list index out of range в последнем подцикле while, и я не могу понять, почему. Цикл while учитывает новую длину списка (while i < len(my_list) + 1). Чего мне не хватает?

1 Ответ

0 голосов
/ 18 ноября 2018

Ваша проблема в том, что вы используете те вложенные циклы while, которые не выходят до тех пор, пока их условие не станет ложным .Таким образом, проверка внешнего цикла while на то, что i меньше длины my_list, не происходит, пока не завершатся все вложенные циклы while (чего никогда не будет).В частности, я думаю, что проблема заключается в последнем цикле while:

while i > insert_position:
    list_copy.append(my_list[i-1])
    i += 1

Этот цикл while не закончится, потому что i всегда будет больше, чем insert_position, и в итоге значение i будетза пределами длины вашего my_list.


Если вы измените логику кода для использования if операторов внутри цикла while, я думаю, что это будет лучше, и тогда вам нужно только увеличить iодин раз в конце:

i = 0
while i < len(my_list) + 1:
    if i < insert_position:
        list_copy.append(my_list[i])
    elif i == insert_position:
        list_copy.append(value)
    else:
        list_copy.append(my_list[i-1])

    i += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...