В python я знаю, как удалять элементы из списка.
item_list = ['item', 5, 'foo', 3.14, True]
item_list.remove('item')
item_list.remove(5)
Этот код выше удаляет значения 5 и item из item_list. Но когда нужно удалить много вещей, мне приходится писать много строк
item_list.remove("something_to_remove")
Если я знаю индекс того, что удаляю, я использую:
del item_list[x]
где x - индекс элемента, который я хочу удалить.
Если я знаю индекс всех чисел, которые хочу удалить, я использую какой-то цикл для del
элементов в индексах.
Но что, если я не знаю индексы элементов, которые хочу удалить?
Я попробовал item_list.remove('item', 'foo')
, но получил сообщение об ошибке, требующее remove
только одного аргумента.
Есть ли способ удалить несколько элементов из списка одним оператором?
PS Я использовал del
и remove
. Может кто-нибудь объяснить разницу между этими двумя, или они одинаковы?
Спасибо
del
удаляет элемент по его индексу.remove
Функция списка находит индексировать элемент , а затем вызываетdel
по этому показателю.Ответы:
В Python создать новый объект часто лучше, чем изменять существующий:
Что эквивалентно:
В случае большого списка отфильтрованных значений (здесь
('item', 5)
небольшой набор элементов) использование aset
может привести к повышению производительности, посколькуin
операция выполняется в O (1):Обратите внимание, что, как объясняется в комментариях и предлагается здесь , следующее может сэкономить еще больше времени, избегая создания набора в каждом цикле:
Цветения фильтр также является хорошим решением , если память не дешево.
источник
in
работы. См. Этот тест для сравнения четырех примитивных структур данных. Да, набор создается в каждом цикле, как предлагается здесь , следовательно, сохранение набора в специальной переменной для использования в выражении генератора может сэкономить время.id(item_list)
до и послеitem_list = [e for e in item_list if e not in ('item', 5)]
. Проверьте мой ответ, чтобы узнать, как изменить список на месте.окончательный список после удаления должен быть следующим
Однострочный код
вывод будет следующим
источник
Я не знаю, почему все забыли упомянуть удивительные возможности
set
s в python. Вы можете просто преобразовать свой список в набор, а затем удалить все, что хотите удалить, с помощью простого выражения, например:источник
Я отправляю свой ответ здесь, потому что я видел, что он также подходит здесь. Он позволяет удалить несколько значений или удалить только дубликаты этих значений и возвращает либо новый список, либо изменяет данный список на месте.
Расширение строки документации:
Вы должны четко понимать, что вы действительно хотите сделать, изменить существующий список или создать новый список с отсутствующими конкретными элементами. Это важно делать, если у вас есть вторая ссылка, указывающая на существующий список. Если у вас есть, например ...
Это может быть или не быть тем поведением, которое вы хотите.
источник
Вы можете использовать filterfalse функцию из itertools модуля
пример
Вывод:
источник
Я не совсем понимаю, почему вам не нравится .remove, но чтобы получить первый индекс, соответствующий значению, используйте .index (value):
затем удалите соответствующее значение:
.index (значение) получает первое вхождение значения, а .remove (значение) удаляет первое вхождение значения
источник
del item_list[ind]
вместо,pop
если вам не нужно значение результата.Вы можете использовать это -
Предположим, у нас есть список,
l = [1,2,3,4,5]
Мы хотим удалить последние два элемента в одном выражении
У нас есть вывод:
Будь проще
источник