Почему я получаю «IndexError: индекс списка вне диапазона», когда я пытаюсь удалить запись из моего списка в блоке кроме - PullRequest
0 голосов
/ 11 апреля 2019

Когда я пытаюсь запустить эту функцию, я получаю ошибку индекса: список вне диапазона.Ошибка возникает в блоке кода исключения, когда я пытаюсь использовать list.remove(list[i]).Не уверен, почему я получаю ошибку выхода за пределы диапазона, и любая помощь будет принята с благодарностью!

Я уже пробовал отлаживать различные операторы печати вокруг своей функции, и я увидел, что моя запись в порядке,он просто выдает эту ошибку всякий раз, когда я пытаюсь удалить запись в моем блоке кроме.

def subnet_insertion_sort(list):
    with open('bad_subnets.csv', 'w') as z:
        # Traverse through 1 to len(list)
        for i in range(1, len(list)):
            # extracts subnet from current list observed in list
            # and casts it as a ip_network objects
            try:
                key_subnet = ipaddress.ip_network(unicode(list[i][0]))

                j = i - 1
                # Move elements of list[0..i-1], that are
                # greater than key, to one position ahead
                # of their current position
                while (j >= 0 and key_subnet < ipaddress.ip_network(unicode(list[j][0]))):
                        temp = list[j]
                        list[j] = list[j + 1]
                        list[j + 1] = temp
                        j -= 1
            except:
                print("invalid subnet found: " + list[i][0] +  " on line " + str(i) + ". It has been added to bad_subnets.csv")
                writer_z = csv.writer(z)
                writer_z.writerow(list[i])
                list.remove(list[i])
                continue

        return list

Мой ожидаемый результат будет состоять в том, что функция работает правильно, и я получил список без недействительных подсетей, но мой фактический вывод - ошибка индекса: список вне диапазона.

Ответы [ 2 ]

3 голосов
/ 11 апреля 2019

Как только вы начнете цикл for с

for i in range(1,len(list))

Если длина вашего оригинального списка составляет 10, он будет преобразован в

for i in range(1,10)

Если вы удалите элементы из своего списка в цикле, это не изменит диапазон. Как только диапазон превысит длину текущего списка, он вызовет ошибку индекса.

0 голосов
/ 11 апреля 2019

Никогда не меняйте список, а создавайте новый список:

def subnet_insertion_sort(ipaddresses):
    valid_addresses = []
    with open('bad_subnets.csv', 'w') as z:
        writer_z = csv.writer(z)
        for i, address in enumerate(ipaddresses):
            try:
                key_subnet = ipaddress.ip_network(address)
            except ValueError:
                print("invalid subnet found: {} on line {} It has been added to bad_subnets.csv".format(address, i)
                writer_z.writerow(address)
            else:
                valid_addresses(key_subnet)
    return sorted(valid_addresses)
...