Мне нужно удалить элементы списка, которые больше 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]
Почему у меня возникают проблемы с первым кодом?
Отвечает ли это на ваш вопрос? Как удалить элементы из списка во время итерации?
Вы изменяете список, пока перебираете его. Это означает, что при первом прохождении цикла 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)
Я знаю, как это сделать, но вопрос в том, почему я столкнулся с проблемой с первым кодом??
На первой итерации первое значение равно 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]
Не удаляйте элементы во время итерации по ним.