Удаление элементов списка
Все способы удаления элементов из списка Python: remove(), pop(), del, clear() и списковые включения — с примерами и нюансами.
Списки Python — это изменяемые последовательности, поэтому вы можете удалять элементы в любой момент. В этой главе рассматриваются все встроенные инструменты для удаления элементов списка: remove(), pop(), оператор del, clear() и списковые включения. Каждый подход подходит для определённой ситуации, и умение выбирать нужный помогает избежать распространённых ошибок.
Краткий справочник
| Метод / оператор | Удаляет по | Возвращает удалённый элемент? | Ошибка, если цель не найдена? |
|---|---|---|---|
list.remove(value) | Первому совпадающему значению | Нет | ValueError |
list.pop() | Последнему элементу (по умолчанию) | Да | IndexError при пустом списке |
list.pop(index) | Элементу по индексу | Да | IndexError при выходе за границы |
del list[index] | Элементу по индексу | Нет | IndexError при выходе за границы |
del list[start:stop] | Срезу элементов | Нет | Никогда (пустой срез допустим) |
list.clear() | Всем элементам | Нет | Никогда |
| Списковое включение | Элементам, соответствующим условию | Нет (возвращает новый список) | Никогда |
Метод remove()
list.remove(value) находит первое вхождение value и удаляет его. Если значение отсутствует, Python генерирует исключение ValueError.
Удалить элемент по значению
Удаляется только первое вхождение
Если значение встречается несколько раз, remove() удаляет только первое совпадение, оставляя остальные:
my_list = [1, 3, 2, 3, 4, 3]
my_list.remove(3)
print(my_list) # [1, 2, 3, 4, 3]Защита от ValueError
Всегда проверяйте наличие значения перед вызовом remove() или перехватывайте исключение:
Проверка с помощью in перед удалением
Перехват исключения
my_list = [1, 2, 4, 5]
try:
my_list.remove(3)
except ValueError:
print("3 is not in the list")
# Output: 3 is not in the listУдаление всех вхождений с помощью цикла
Используйте цикл while, чтобы продолжать удалять значение до тех пор, пока оно не исчезнет:
Удалить все вхождения элемента
Метод pop()
list.pop(index) удаляет элемент по index и возвращает его, чтобы вы могли использовать это значение. Если индекс не указан, метод удаляет и возвращает последний элемент. Это делает pop() идеальным выбором, когда нужно обработать удалённое значение.
Удалить последний элемент
Удалить элемент по конкретному индексу
my_list = [1, 2, 3, 4, 5]
item = my_list.pop(1) # removes and returns 2
print(item) # 2
print(my_list) # [1, 3, 4, 5]IndexError при вызове pop()
Вызов pop() на пустом списке или с индексом вне допустимого диапазона вызывает IndexError:
empty = []
empty.pop() # IndexError: pop from empty list
my_list = [1, 2, 3]
my_list.pop(10) # IndexError: pop index out of rangeОператор del
del удаляет элемент (или срез элементов) из списка по позиции, ничего не возвращая.
Удалить один элемент по индексу
Удалить элемент с индексом 2
Удалить срез элементов
del принимает ту же нотацию срезов, что и индексирование, что позволяет легко удалить диапазон элементов за один шаг:
my_list = [1, 2, 3, 4, 5]
del my_list[1:3] # removes index 1 and 2 (values 2 and 3)
print(my_list) # [1, 4, 5]Удаление пустого или выходящего за границы среза никогда не вызывает ошибку — оно просто не имеет никакого эффекта.
Удалить переменную списка целиком
del может также удалить саму переменную списка, а не только его содержимое:
my_list = [1, 2, 3]
del my_list
# my_list is now undefined; referencing it raises NameErrorМетод clear()
list.clear() удаляет все элементы из списка, оставляя пустой список. Сам объект списка при этом сохраняется (в отличие от del my_list).
my_list = [1, 2, 3, 4, 5]
my_list.clear()
print(my_list) # []clear() эквивалентен del my_list[:] (удаление всего среза), но читается нагляднее.
Списковое включение для условного удаления
Списковое включение формирует новый список, включая только те элементы, которые удовлетворяют условию, тем самым эффективно отфильтровывая ненужные. Это наиболее понятный способ удалить все элементы, соответствующие сложному условию.
Удалить все вхождения значения
Удалить все чётные числа
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
odd_only = [x for x in numbers if x % 2 != 0]
print(odd_only) # [1, 3, 5, 7]Поскольку списковое включение возвращает новый список, а не изменяет исходный, его безопасно использовать, когда нужно сохранить оригинал неизменным или когда условие фильтрации охватывает несколько значений одновременно.
Выбор подходящего способа
- Знаете значение, но не индекс? Используйте
remove()(первое совпадение) или списковое включение (все совпадения или сложные условия). - Знаете индекс? Используйте
pop(index), если нужно получить значение обратно, илиdel list[index], если нет. - Нужно очистить весь список? Используйте
clear(). - Нужно удалить диапазон последовательных элементов? Используйте
del list[start:stop].
Связанные главы
- Python Lists — создание, индексирование и основы работы со списками
- Access List Items — индексирование и срезы
- Add List Items —
append(),insert(),extend() - Change List Items — обновление значений на месте
- List Comprehension — фильтрация и преобразование списков
- List Methods — полный справочник всех методов списка
- Remove List Duplicates — удаление дубликатов из списка
- Sort Lists —
sort()иsorted()