Получение индекса вне допустимого диапазона в python - PullRequest
1 голос
/ 02 августа 2020

Я только начинаю в Python и наткнулся на этот вопрос. Проверяет массив целых чисел и устраняет любое дублирование значений. Все отдельные целые числа перемещаются в левую часть массива

Я пытаюсь найти все повторяющиеся записи в массиве, удалить их и переместить остальные элементы влево.

Это код, который я написал, и я просто не могу понять, что не так и как он выходит из индекса. Я попытался написать его на C ++, и он отлично работает. Может ли кто-нибудь помочь мне и объяснить мне, как он выходит из индекса.

array = [2,2,3,5,2,5,6,2,4,8,3,36,8,2]

for i in range(len(array)-1,-1,-1):
    for j in range(0,i):
        if(array[j]==array[i]):
            del array[i]
            
print(array)

Ожидаемый результат

[2, 3, 5, 6, 4, 8, 36]

Ответы [ 3 ]

3 голосов
/ 02 августа 2020

Как только вы удалите элемент по текущему индексу после нахождения другого элемента с тем же значением, вам нужно break из l oop, поскольку i больше не относится к тому же элементу. Демо

array = [2,2,3,5,2,5,6,2,4,8,3,36,8,2]
 
for i in range(len(array)-1,-1,-1):
    for j in range(0,i):
        if(array[j]==array[i]):
            del array[i]
            break
print(array)
1 голос
/ 02 августа 2020

Это произошло из-за того, что вы перебирали массив (или список) до последнего индекса и одновременно изменяли его длину. Диапазон, который вы создали в начале l oop, ничего не знает об изменениях размера списка. Если вы решите управлять текущим индексом вручную, у вас будет способ избежать этого. Но это немного не pythoni c, так как выглядит изощренно.

Вы можете просто выполнить ту же задачу другим способом, чтобы избежать этой проблемы и использовать возможности Python. Например, вы можете использовать set для фильтрации всех дубликатов:

array = [2,2,3,5,2,5,6,2,4,8,3,36,8,2]

results = set(array)
print(result)

Но, как я указал в комментариях ниже, это, скорее всего, изменит порядок элементов в списке. B Если вам нужно удалить дубликаты, но оставить порядок без изменений, это определенно не лучший способ.

Или вы можете использовать другой список для хранения результатов:

array = [2,2,3,5,2,5,6,2,4,8,3,36,8,2]
results = []

for number in array:
    if number not in results:
        results.append(number)

print(results)
0 голосов
/ 02 августа 2020

В первой итерации i указывает на последний элемент, а j - на первый элемент. Поскольку они одинаковы, вы удаляете один элемент массива. Теперь в массиве на один элемент меньше, чем раньше, и элемент, на который указывает i, больше не существует. Таким образом, вы получите ошибку индекса.

...