Я попытался выполнить это, но это не работает должным образом. Моей целью было убрать все числа деленные на 2. Может кто подскажет что не так. Я действительно не понимаю, почему «4», «8» все еще там.
list = [2,4,9,0,4,6,8,3,43,44]
for e in list:
if e%2==0:
list.remove(e)
print(list)
Возможный дубликат странный результат при удалении элемента из списка






Вы можете попробовать использовать list.pop() с позицией элемента, который хотите удалить. «2» и «4» все еще там, потому что они пропускаются, когда вы удаляете число перед ними (когда вы удаляете «2», «4» перемещается на предыдущую позицию)
Быстрый комментарий для полноты. list.pop(index) удаляет элемент из списка, но также возвращает его. Использование del list[index] просто удалит его.
Вы можете использовать понимание списка для создания нового списка только с элементами, которые вы хотите сохранить.
newList = [x for x in oldList if not isEven(x)]
где функция isEven делает что-то вроде:
def isEven(target):
return target % 2 == 0
Кстати, ваш вопрос дублирует следующий Как удалить элементы из списка во время итерации?
[x for x in oldList if x % 2] может быть проще, чем реализовать isEven метод. Но не для повторного использования.
Абсолютно вы правы. Я только что показал полный пример, где условие в понимании списка может быть более сложным, чем это:)
Ага-ага. Не критикую ;)
Попробуй это:
l = [2, 3, 4, 5, 9, 10,30,45]
new=[el for el in l if el % 2]
print(new)
На самом деле, когда вы удаляете элемент из списка, индексация меняется. Итак, вы можете сделать это понимание списка. Также вы можете использовать:
l = [2, 3, 4, 5, 9, 10,30,45]
new=[filter(lambda x: x % 2, l)]
print(new)
Если вы хотите сохранить список, а не создавать новый (ответ Томаса Милокса в противном случае хорош), вам следует выполнить итерацию по списку в обратном порядке по индексу. Когда вы удаляете элемент из списка во время итерации вперед по списку, вы можете перескакивать через некоторые элементы, не обрабатывая их. Возврат назад гарантирует, что никакие удаления элементов списка не перемещают какие-либо элементы, которые вы все еще можете обработать.
Вот пример того, как это может выглядеть для вашего кода:
list = [2, 4, 9, 0, 4, 6, 8, 3, 43, 44]
for i in range(len(list) - 1, -1, -1): # start at the last element, go until the first one (index 0 - the last value in the range method will not be reached), go backwards
if list[i] % 2 == 0:
del list[i]
Вы можете прочитать немного больше об удалении элемента по индексу, а не по значению здесь.
Это необходимо, поскольку в противном случае вы изменили бы список в неправильной позиции для повторяющихся значений. Это также может быть немного быстрее, так как remove нужно перебирать список, ища элемент для удаления, в то время как del list[i] может искать элемент, который нужно удалить, по индексу.
Возможный дубликат Как удалить элементы списка в цикле for в Python?