Удаление элементов в списке (Python)

Я попытался выполнить это, но это не работает должным образом. Моей целью было убрать все числа деленные на 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)

Возможный дубликат Как удалить элементы списка в цикле for в Python?

Sayse 27.02.2019 15:30

Возможный дубликат странный результат при удалении элемента из списка

Paritosh Singh 27.02.2019 15:30
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
278
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете попробовать использовать list.pop() с позицией элемента, который хотите удалить. «2» и «4» все еще там, потому что они пропускаются, когда вы удаляете число перед ними (когда вы удаляете «2», «4» перемещается на предыдущую позицию)

Быстрый комментарий для полноты. list.pop(index) удаляет элемент из списка, но также возвращает его. Использование del list[index] просто удалит его.

ingofreyer 27.02.2019 15:50

Вы можете использовать понимание списка для создания нового списка только с элементами, которые вы хотите сохранить.

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 метод. Но не для повторного использования.
akhavro 27.02.2019 15:41

Абсолютно вы правы. Я только что показал полный пример, где условие в понимании списка может быть более сложным, чем это:)

Thomas Milox 27.02.2019 15:42

Ага-ага. Не критикую ;)

akhavro 27.02.2019 15:43

Попробуй это:

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] может искать элемент, который нужно удалить, по индексу.

Здесь также рассматривается итерация назад по списку.

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