kpa6uu
@kpa6uu
Программист Талибана [Пыхерский Алибаба]

Почему цикл for в языке Python 3 ведёт себя не так, как надо?

Задание - в полученном списке оставить лишь повторяющиеся элементы.
Пробовал реализовать следующим образом, но цикл for ведёт себя довольно странно - прыгает через один индекс.

def checkio(data):
    for value in data:
 
        if data.count(value) < 2:
 
            data.remove(value)
 
    return data
 
print(checkio([1, 2, 3, 4, 5]))

То есть проверяются значения: 1, 3, 5. Двойка и четвёрка каким-то магическим образом минуют проверку.

Если же заменить цикл for на while, то всё окей:

def checkio(data):

    i = 0
    while i < len(data):
 
        value = data[i]
 
        if data.count(value) < 2:
 
            data.remove(value)
 
    return data
 
print(checkio([1, 2, 3, 4, 5]))

Из-за чего это происходит? Как нужно было правильно реализовать?
  • Вопрос задан
  • 597 просмотров
Решения вопроса 4
dimonchik2013
@dimonchik2013
non progredi est regredi
тут не как в ПХП ))

это итератор, один вызов - один шаг,
торкнули два раза - сделали два шага

учите магию списков:
www.secnetix.de/olli/Python/list_comprehensions.hawk

реализовать можно, например:

l = [x for x in l if l.count(x)>1]
Ответ написан
Комментировать
For работает через итераторы. При удалении элемента из списка итератор становится некорректным.

Пример.

[1, 2, 3, 4, 5] | обработка первого элемента = 1
[2, 3, 4, 5] | удаление элемента = 1
[2, 3, 4, 5] | обработка второго элемента. Но в получившемся списке после удаления, вторым элементом является 3, а не 2.
Ответ написан
Комментировать
@deliro
Нельзя итерироваться по списку и удалять в нём элементы одновременно.
P.S. Вот моё решение, если интересно.
Ответ написан
Комментировать
@GeneD88
QA
этот вопрос уже задавался - Почему не удаляются все элементы списка?

мое решение с итерированием и удалением:
def checkio(data):
    for i in data[-1::-1]:
        if data.count(i) < 2:
            data.remove(i)
    return data
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@mik222
Ваш код, простите, упорот.
Вы O(N) проблему превратили в O(N^2).
Не говоря уже о том, что вы изменяете итерируемый массив.
Уложите значения в хеш таблицу. Проверяйте на >2 на каждой итерации и получите ваше решение.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы