Основные методы удаления элементов из списка
В Python можно несколькими способами удалить записи из списка. У каждого метода — свое назначение, поэтому выбор между ними зависит от текущей задачи:
- remove() — применяется для удаления первого элемента, совпадающего с указанным значением;
- pop() — используется для удаления и возврата элемента по индексу;
- del() — нужен для удаления элемента по индексу/срезу (срез — это инструмент, с помощью которого можно выбрать последовательность значений);
- clear() и операция присваивания — для полной очистки содержимого объекта.
Чтобы работать с этими методами эффективно, важно учитывать не только их назначение, но и ограничения, которые рассмотрим далее.
Как удалить элемент по значению
Когда значение удаляемого элемента известно, лучше всего подойдет метод remove():
books = ["Капитанская дочка", "Мастер и Маргарита", "Станционный смотритель", "Евгений Онегин"]
books.remove("Мастер и Маргарита")
print(books)
# Вывод: ['Капитанская дочка', 'Станционный смотритель', 'Евгений Онегин']
При этом удалится только первая запись с совпадающим значением. Если в списке есть повторы, то они останутся:
books = ["Капитанская дочка", "Мастер и Маргарита", "Станционный смотритель", "Евгений Онегин", "Мастер и Маргарита"]
books.remove("Мастер и Маргарита")
print(books)
# Вывод: ['Капитанская дочка', 'Станционный смотритель', 'Евгений Онегин', 'Мастер и Маргарита']
Если указать несуществующую строку, то вернется ValueError:
books = ["Капитанская дочка", "Мастер и Маргарита", "Руслан и Людмила", "Евгений Онегин"]
books.remove("Собачье сердце")
# Результат: ValueError: list.remove(x): x not in list
Как удалить элемент по индексу
Бывают и ситуации, когда известен только индекс записи, которую нужно удалить. Тогда подойдут два метода.
- Pop() — удаляет содержимое по индексу, а также возвращает его значение:
authors = ["Александр Пушкин", "Александр Островский", "Федор Достоевский", "Лев Толстой"]
deleted = authors.pop(1)
print(deleted)
print(authors)
# Вывод:
# Александр Островский
# ['Александр Пушкин', 'Федор Достоевский', 'Лев Толстой']
Если в pop() ничего не передать, то удаляется последняя запись:
authors = ["Александр Пушкин", "Александр Островский", "Федор Достоевский", "Лев Толстой"]
deleted = authors.pop()
print(deleted)
print(authors)
# Вывод:
# Лев Толстой
# ['Александр Пушкин', 'Александр Островский', 'Федор Достоевский']
Pop() предпочтительнее, когда удаляемое значение еще будет использоваться.
- Del() — удаляет запись по индексу:
cities = ["Москва", "Екатеринбург", "Санкт-Петербург", "Ростов-на-Дону"]
del cities[1]
print(cities)
# Вывод: ['Москва', 'Санкт-Петербург', 'Ростов-на-Дону']
Также можно указать срез:
cities = ["Москва", "Екатеринбург", "Санкт-Петербург", "Ростов-на-Дону"]
del cities[1:3] # Удалены будут записи с индексами 1, 2
print(cities)
# Вывод: ['Москва', 'Ростов-на-Дону']
Если выйти за рамки списка, то вернется IndexError, например:
list = [10, 20, 30, 40]
del list[5]
# Результат: IndexError: list assignment index out of range
Как удалить все элементы списка
Иногда возникают ситуации, когда нужно очистить все содержимое. Это можно сделать с помощью clear() либо через операцию присваивания:
items = [1, 2, 3]
items.clear()
print(items)
# Результат: []
items = []
print(items)
# Результат: []
Важно понимать, что оба метода нужны для очистки содержимого, а не для удаления самого объекта списка, но разница между ними все же есть: при использовании clear() ссылка на объект остается неизменной, а если выполняется операция присваивания — меняется.
Также очистить список позволяет del():
seasons = ['зима', 'весна', 'лето', 'осень']
del seasons[:]
print(seasons)
# Вывод: []
Ссылка на объект не меняется.
Примеры использования методов del, remove и pop в Python
Рассмотрим еще несколько примеров применения методов:
- Если передать del() отрицательный индекс, то удалена будет последняя запись:
seasons = ['зима', 'весна', 'лето', 'осень']
del seasons[-1]
print(seasons)
# Вывод: ['зима', 'весна', 'лето']
- С помощью срезов можно задать шаг, с которым нужно удалить записи:
seasons = ['зима', 'весна', 'лето', 'осень']
del seasons[::2]
print(seasons)
# Вывод: ['весна', 'осень']
- Чтобы очистить все записи с определенным содержимым, можно воспользоваться циклом while:
fruits = ['киви', 'банан', 'апельсин', 'яблоко', 'киви']
while 'киви' in fruits:
fruits.remove('киви')
print(fruits)
# Вывод: ['банан', 'апельсин', 'яблоко']
- Pop() используют, когда удаляемое значение еще пригодится, так как метод возвращает его. Выглядеть это может так:
values = [10, 20, 30, 40, 50]
total = 0
while values:
total += values.pop()
print(total)
# Вывод: 150
Частые ошибки при удалении элементов
- Попытка обратиться к несуществующему значению/индексу. Чтобы избежать возникающих в таких случаях ошибок, можно проверять, есть ли данное значение:
numbers = [1, 2, 3]
if 4 in numbers:
numbers.remove(4)
print(numbers)
# Результат: [1, 2, 3]
Или есть ли этот индекс (для этого проверяется длина):
numbers = [1, 2, 3]
if 3 < len(numbers):
numbers.pop(3)
print(numbers)
# Результат: [1, 2, 3]
- Попытка очистить записи в цикле. В чем проблема таких операций? Когда элементы начинают удаляться, индексы следующих значений изменяются, в то время как цикл продолжает обходить список по его исходным позициям. Поэтому лучше создать цикл, который будет обходить копию списка:
values = [1, 2, 2, 3]
for num in values[:]:
if num == 2:
values.remove(num)
print(values)
# Результат: [1, 3]
Второй вариант — использовать цикл while, как это показано в примерах.
- Попытка удалить данные во вложенном списке:
nested = [[1, 2], [3, 4], [5, 6]]
nested.remove(3)
# Результат: ValueError: list.remove(x): x not in list
Чтобы избежать ошибки, нужно использовать цикл:
nested = [[1, 2], [3, 4], [5, 6]]
for sublist in nested:
if 3 in sublist:
sublist.remove(3)
print(nested)
# Результат: [[1, 2], [4], [5, 6]]