@bushmaks

Почему в цикл не попадают элементы из списка?

Есть код:
data = [1,2,3,4,5]
for a in data:
    if data.count(a) == 1:
        data.remove(a)
print(data)

По идее, он должен убирать все уникальные элементы списка, но он почему то не пропускает в for 2 и 4. Не могу понять почему. Решил задачу с помощью введения отдельного списка, но все равно интересно, почему тут так сработало.
  • Вопрос задан
  • 186 просмотров
Решения вопроса 3
@fireSparrow
Это популярная ошибка. Никогда не меняйте ту последовательность, по которой итерируетесь.

Ваш код обрабатывает первый элемент, и он знает, что после этого он должен перейти ко второму элементу. Он так и делает. Но после удаления элемента все последующие элементы сдвигаются. И на втором месте у вас стоит уже число 3. А число 2 ушло на первое место, которое уже было обработано, и к нему интерпретатор уже не вернётся. Поэтому двойка осталась необработанной.

Решить проблему можно, если итерироваться по копии последовательности, а удалять - из оригинальной.

data = [1,2,3,4,5]
for a in data.copy():
    if data.count(a) == 1:
        data.remove(a)
print(data)
Ответ написан
longclaps
@longclaps
Потому что итератор по списку for a in data - это просто синтаксический сахар над чем-то вроде этого:
from itertools import count # это генератор бесконечной последовательности 0,1,2,...

try:
    for i in count(0): # вот этого
        a = data[i]    # и этого
        if data.count(a) == 1:
            data.remove(a)
        print(a, data)
except IndexError:
    print(data)
Ответ написан
AlexSetup
@AlexSetup
Python
Ответ на Ваш вопрос: Ваш алгоритм берет 1 и удаляет ее. Теперь он должен взять второй элемент, но это не 2, а 3, так как вы удалили первый элемент и он отсчитывает второй элемент из новой последовательности чисел!
data = [1,2,3,4,5]
a=[]
for i in range(len(data)):
    if data.count(data[i]) != 1:
        a.append(data[i])
print(a)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы