Удалить нечетные элементы из списка в Python
Я пытаюсь удалить элементы с нечетным индексом из моего списка (где нуль считается четным), но удаление их таким образом не будет работать, потому что оно отменяет значения индекса.
Как я могу перебирать список и удалять эти нечетные элементы?
2 ответа
Вы можете удалить все нечетные элементы за один раз, используя срез:
Вы не можете удалять элементы из списка во время его перебора, потому что итератор списка не настраивается при удалении элементов. См. Loop «Забывает» для удаления некоторых элементов, что происходит при попытке.
Альтернативой было бы создать новый объект списка для замены старого, используя понимание списка с enumerate() предоставляющим индексы:
Это сохраняет четные элементы, а не удаляет нечетные элементы.
Поскольку вы хотите устранить нечетные элементы и сохранить четные, вы можете использовать фильтр следующим образом:
Как удалить все чётные элементы списка?
Как удалить все чётные и нечётные элементы списка (нужны оба варианта) в Python 3.x? С чётными пробовал вот так:
Ответы (3 шт):
Значит, у Вас массив a изначально содержит переменные типа string, стало быть нужно их переводить в int перед проверкой на четность.
Заметьте, что списки a1 и a2 будут также содержать переменные строкового типа.
А если Вам нужно хранить переменные целочисленного типа, нужно их преобразовать.
Для выборки из списка элементов, удовлетворяющих какому-то условию, можно воспользоваться методом filter :
Для эффективного решения подобных задач удобно воспользоваться модулем Numpy:
Удалить элементы с нечетным индексом из списка в Python
Я пытаюсь удалить элементы с нечетным индексом из моего списка (где нуль считается четным), но удаление их таким образом не будет работать, потому что оно отменяет значения индекса.
Как я могу перебирать список и удалять эти нечетные элементы?
Поскольку вы хотите устранить нечетные элементы и сохранить четные, вы можете использовать фильтр следующим образом:
этот подход имеет накладные расходы на создание нового списка.
Вы можете удалить все нечетные элементы за один раз, используя срез:
Вы не можете удалять элементы из списка во время его перебора, потому что итератор списка не настраивается при удалении элементов. См. Loop «Забывает» для удаления некоторых элементов, что происходит при попытке.
Альтернативой было бы создать новый объект списка для замены старого, используя понимание списка с enumerate() предоставляющим индексы:
Как удалить элементы в списке Python во время цикла — решение
Очень распространенной задачей является перебор списка и удаление некоторых элементов в зависимости от условия. В этой статье показаны различные способы , как это сделать, а также показаны некоторые распространенные ловушки, которых следует избегать .
Допустим, нам нужно изменить список a и удалить все нечетные элементы. У нас есть эта маленькая вспомогательная функция, чтобы определить, является ли число четным или нет.
Вариант 1. Создайте новый список, содержащий только те элементы, которые вы не хотите удалять
1a) Нормальное понимание списка
Используйте генератор списков, чтобы создать новый список, содержащий только те элементы, которые вы не хотите удалять, и верните его в a.
1b) Понимание списка путем назначения среза a[:]
Приведенный выше код создал новую переменную a . Мы также можем изменить существующий список на месте, назначив фрагменту a[:] . Этот подход более эффективен и может быть полезен, если есть другие ссылки на a то, что необходимо отразить изменения.
1с) Использование itertools.filterfalse()
Модуль itertools предоставляет различные функции для очень эффективного цикла, а также предлагает метод фильтрации элементов:
Вариант 2. Перебрать копию
Если вы действительно хотите сохранить синтаксис цикла for , вам нужно перебрать копию списка (копия просто создается с помощью a[:] ). Теперь вы можете удалять элементы из исходного списка, если условие истинно.
Чего не делать
Не перебирайте один и тот же список и не изменяйте его во время итерации!
Это тот же код, что и выше, за исключением того, что здесь мы не повторяем копию. Удаление элемента сдвинет все последующие элементы на одно место влево, поэтому в следующей итерации один элемент будет пропущен. Это может привести к неверным результатам.
Кроме того, никогда не изменяйте индекс во время цикла по списку!
Это неверно, потому что изменение i внутри цикла НЕ повлияет на значение i в следующей итерации . Этот пример также производит нежелательные эффекты и даже приводит к ошибкам IndexError, как здесь.