индекс списка вне диапазона при написании программы для удаления дублирующих элементов

Я пытаюсь удалить дубликаты элементов, но он показывает индекс списка вне диапазона ошибок при l = n [i]

n=list(input().split())

for i in range(len(n)):
    l=n[i]
    for j in range(len(n)):
        if(j!=i):
            if(l==n[j]):
                n.pop(j)

print(n)

Всего 1 ответ


Это показывает ошибку, потому что вы pop элементы изнутри, что изменило размер списка во время итерации. Но функция range все еще имеет исходную длину и, таким образом, дает индекс, который больше не существует.

Вы никогда не должны изменять длину списка (или keys словаря) во время итерации по нему.

Подробно, давайте возьмем ваш список n=[1,1,2,3] (скажем). i буду работать в range(3) (т.е. принимать значения 0,1,2,3 )

Теперь l=n[0], ie l=1 . Тогда при j=1, n[j]=1 условие l==n[j] становится true и вы выполняете n.pop(1) .

Итак, теперь ваш список n=[1,2,3] НО ваш самый внешний цикл все еще находится в range(4) и, таким образом, выдаст ошибку, когда вы выполните l=n[3] так как n[3] не существует.

Чтобы избежать этого, у вас есть следующие варианты:

  1. Вставьте неповторяющиеся элементы в новый список. (Или, в качестве альтернативы, сделайте копию оригинального списка и выскочите оттуда).

  2. Используйте set в list , если вам разрешено его использовать.

Кроме того, примечание: list(input().split()) - избыточный вызов конструктора list . .split() возвращает list по умолчанию. Так что достаточно n=input().split() .


Есть идеи?

10000