Мне нужно удалить элементы списка, которые больше 1 в python

Мне нужно удалить элементы списка, которые больше 1

a = [1, 2, 3, 4]

for i in a:
if i>1:
    a.remove(i)
    print(a)

Если я запускаю этот код, он дает [1,3]

Но когда я запускаю второй код:

for i in a[::1]:
if i>1:
    a.remove(i)
    print(a)

это дает результат [1]

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

Не удаляйте элементы во время итерации по ним.

Abdul Niyas P M 13.12.2020 08:32

Отвечает ли это на ваш вопрос? Как удалить элементы из списка во время итерации?

jizhihaoSAMA 13.12.2020 08:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
940
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы изменяете список, пока перебираете его. Это означает, что при первом прохождении цикла I> 1, поэтому I>1 удаляется из списка. Затем цикл for переходит к третьему элементу списка, а это не 3, а 4! Затем он удаляется из списка, а затем цикл for переходит к третьему элементу в списке, который теперь равен 4. И так далее. Возможно, это проще визуализировать так, когда ^ указывает на значение

Проверить визуализацию происходящего

[1, 2, 3, 4, 5, 6]
    ^
[1, 3, 4, 5, 6]
       ^
[1, 3, 5, 6]
          ^
[1, 3, 5]

В этом примере условие i>1 соответствует элементу 2 и удаляет его, но 3 заменяет 2-ю позицию 2. Таким образом, 3 получает пропуск для удаления. Таким образом, 5 также пропускается, и окончательный вывод будет выглядеть как

[1, 3, 5]

Чтобы избежать этого способа удаления, вы можете установить условие, чтобы пропустить элемент, который вам нужно удалить, и добавить элементы в новый список, который вам не нужно удалять, например:

ls = [i for i in a if i <= 1]
print(ls)

Я знаю, как это сделать, но вопрос в том, почему я столкнулся с проблемой с первым кодом??

Avijit Kar 13.12.2020 08:34

На первой итерации первое значение равно 1, поэтому 1 > 1, что ложно без изменений, равно list[1, 2, 3, 4], затем переходит ко второму значению, равному 2, bcz 2 > 1, 2 удалит из списка, поэтому ваш новый список будет выглядеть как [1, 3, 4], затем он перейдет к 3-му элементу в обновленном списке, который равен 4, а не 3, поэтому он удалит 4 и выйдет из цикла for,

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

 import math
 raw_data = [56.2, float('NaN'), 51.7, 55.3, 52.5, float('NaN'), 47.8]
 filtered_data = []
 for value in raw_data:
     if not math.isnan(value):
         filtered_data.append(value)

 filtered_data

вывод: [56,2, 51,7, 55,3, 52,5, 47,8]

Источник: документация Python https://docs.python.org/3.9/tutorial/datastructures.html

a = [1, 2, 3, 4]

если вы удалите элемент во время итерации, то положение его элементов изменится.

После второй итерации значение i равно 2, тогда данный список становится [1, 3, 4] И во время третьей итерации значение i не 3, а 4 (поэтому оно будет удалено)

Окончательный результат будет [1, 3]

Другие вопросы по теме