Как удалить элемент из списка в Python: remove(), pop(), del и другие способы

Удалить элемент из списка в Python можно пятью способами: remove() по значению, pop() и del по индексу, генератор списка для всех совпадений и clear() для очистки.

Разбираем каждый на примерах с реальным выводом, ошибки ValueError и IndexError, ловушку удаления в цикле и замер скорости pop(0).

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 2944 статьи автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3598 экспертных мнений Подписаться на Телеграм-канал
Обложка: Как удалить элемент из списка в Python: remove(), pop(), del и другие способы

Чтобы удалить элемент из списка в Python, выберите способ по тому, что вы знаете об элементе. Знаете значение, вызовите список.remove(значение). Знаете позицию, берите список.pop(индекс), если удалённый элемент ещё нужен, или del список[индекс], если нет. Нужно убрать все совпадения или всё, что подходит под условие, соберите новый список генератором: [x for x in список if x != значение]. Очистить список целиком помогает список.clear().

Ниже каждый способ с примером и реальным выводом Python 3.14, разбор ошибок ValueError и IndexError и замер скорости. Если вы только начинаете, сначала посмотрите первые простые программы на Python: там видно, как запускать примеры вроде этих.

CheckroiCheckroiПодборка курсов по Python566 курсов • 51 школаСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Какой способ выбрать

Рой убирает лишний элемент из списка на экране ноутбука

Пять инструментов решают пять разных задач. Главное отличие в том, что вы передаёте и что получаете обратно.

Задача Способ Что возвращает Если элемента нет
Удалить по значению первое совпадение a.remove(x) None ValueError
Удалить по индексу и забрать элемент a.pop(i) удалённый элемент IndexError
Удалить по индексу или срезу del a[i], del a[i:j] ничего IndexError для индекса
Удалить все совпадения или по условию [x for x in a if …] новый список ошибки нет
Очистить весь список a.clear() None ошибки нет

Все методы списка описаны в разделе More on Lists официальной документации. Дальше разберём каждый по очереди.

Код из статьи удобно проверять в редакторе. Как создать и запустить файл Python в VS Code, мы разобрали отдельно, а если интерпретатора ещё нет, вот инструкция, как скачать и установить Python.

Метод remove(): по значению

Метод remove() ищет значение слева направо и удаляет только первое совпадение. Остальные копии остаются на месте:

fruits = ["яблоко", "груша", "слива", "груша"]
fruits.remove("груша")
print(fruits)  # ['яблоко', 'слива', 'груша']

Если значения в списке нет, Python остановит программу:

fruits.remove("киви")
# ValueError: list.remove(x): x not in list

Решение: проверить наличие оператором in перед удалением или поймать исключение.

if "киви" in fruits:
    fruits.remove("киви")

try:
    fruits.remove("киви")
except ValueError:
    pass  # значения не было, идём дальше

Первый вариант читается проще. Второй быстрее на длинных списках: список просматривается один раз вместо двух.

Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

pop() и del: по индексу

Индекс в Python считается с нуля, а отрицательный индекс отсчитывает с конца: -1 это последний элемент. Если путаетесь в знаках вроде // и %, держите под рукой разбор операторов Python.

Метод pop() удаляет и возвращает элемент

Без аргумента pop() забирает последний элемент, с аргументом забирает элемент на указанной позиции:

nums = [10, 20, 30, 40]
last = nums.pop()
print(last, nums)   # 40 [10, 20, 30]
first = nums.pop(0)
print(first, nums)  # 10 [20, 30]

Удобно, когда элемент нужен дальше: взять задачу из очереди, снять верхнюю карточку со стопки.

На пустом списке или с индексом за границей будет IndexError: pop from empty list или pop index out of range.

Оператор del удаляет по индексу и срезом

del ничего не возвращает, зато умеет удалять сразу диапазон:

letters = ["a", "b", "c", "d", "e", "f"]
del letters[1]      # ['a', 'c', 'd', 'e', 'f']
del letters[1:3]    # ['a', 'e', 'f']
del letters[-1]     # ['a', 'e']

n = list(range(10))
del n[::2]          # каждый второй, начиная с нулевого
print(n)            # [1, 3, 5, 7, 9]
  • Первый элемент: a.pop(0) или del a[0].
  • Последний элемент: a.pop() или del a[-1].
  • Первые N элементов: del a[:N].

Как удалить все вхождения или элементы по условию

Надёжнее всего собрать новый список только из тех элементов, которые нужно оставить. Это генератор списка, та же логика «если… иначе» в одной строке, что и в тернарном операторе:

data = [3, 1, 3, 2, 3]
data = [x for x in data if x != 3]
print(data)  # [1, 2]

Условие может быть любым. Например, убрать из списка словарей неактивных пользователей:

users = [{"name": "Аня", "active": True}, {"name": "Олег", "active": False}]
users = [u for u in users if u["active"]]
print(users)  # [{'name': 'Аня', 'active': True}]

Есть нюанс. Присваивание data = [...] создаёт новый объект, а другие переменные, которые смотрели на старый список, его не увидят. Если список передан в функцию и менять нужно именно его, присвойте срезу:

data = [3, 1, 3, 2, 3]
alias = data
data[:] = [x for x in data if x != 3]
print(data, alias)  # [1, 2] [1, 2]

Пустые строки и дубликаты

Для двух частых случаев есть короткие записи:

words = ["кот", "", "пёс", "", "ёж"]
print(list(filter(None, words)))   # ['кот', 'пёс', 'ёж']

dup = ["b", "a", "b", "c", "a"]
print(list(dict.fromkeys(dup)))    # ['b', 'a', 'c']

filter(None, …) отбрасывает всё «ложное»: пустые строки, 0, None. Осторожно с числами, ноль тоже уйдёт. dict.fromkeys() убирает повторы и, в отличие от set(), сохраняет порядок.

Как удалить несколько элементов по индексам

Здесь новички ошибаются чаще всего. После каждого удаления элементы справа сдвигаются влево, и следующий индекс указывает уже на другой элемент:

items = ["a", "b", "c", "d", "e"]
for i in [1, 3]:
    del items[i]
print(items)  # ['a', 'c', 'd'] — удалились b и e вместо b и d

Решение: удаляйте с конца, отсортировав индексы по убыванию. Тогда сдвиг не задевает индексы, которые ещё впереди.

items = ["a", "b", "c", "d", "e"]
for i in sorted([1, 3], reverse=True):
    del items[i]
print(items)  # ['a', 'c', 'e']

Как очистить список целиком

Три записи выглядят похоже, но ведут себя по-разному:

  1. a.clear() и del a[:] опустошают сам список. В документации Python clear() описан как аналог del a[:].
  2. a = [] создаёт новый пустой список, а старый остаётся жить в других переменных.
  3. del a удаляет саму переменную. Следующее обращение к a даст NameError.
a = [1, 2, 3]
b = a
a = []
print(a, b)  # [] [1, 2, 3]

a = [1, 2, 3]
b = a
a.clear()
print(a, b)  # [] []

Если список общий для нескольких частей программы, чистите через clear(). Почему две переменные могут указывать на один объект, подробно объясняет разбор классов и объектов в Python.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 700 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Почему цикл for пропускает элементы

Классическая ловушка: удаляем чётные числа прямо в цикле, а одно остаётся.

nums = [1, 2, 2, 3, 4]
for x in nums:
    if x % 2 == 0:
        nums.remove(x)
print(nums)  # [1, 2, 3]

Цикл идёт по позициям. Когда вторая двойка сдвинулась на место удалённой первой, цикл уже перешёл к следующей позиции и её не проверил. В разделе о цикле for документация предупреждает, что код, который меняет коллекцию во время обхода, легко написать с ошибкой, и что обычно проще обойти копию или собрать новую коллекцию.

Оба совета работают:

nums = [1, 2, 2, 3, 4]
for x in nums[:]:          # обходим копию, удаляем из оригинала
    if x % 2 == 0:
        nums.remove(x)
print(nums)  # [1, 3]

nums = [1, 2, 2, 3, 4]
nums = [x for x in nums if x % 2 != 0]   # или новый список
print(nums)  # [1, 3]

С while та же история, если в теле меняется список, по которому идёт условие. Подробнее про такие циклы читайте в статье о цикле while и его частых ошибках.

Скорость: почему pop(0) медленнее pop()

Ряд кубиков сдвигается после удаления первого элемента

Список в Python хранит элементы подряд. Удалили последний элемент, и сдвигать нечего. Удалили первый, и сдвигается весь хвост, как и при вставке в начало списка. В таблице сложности операций на wiki.python.org так и записано: удаление последнего элемента (Pop last) занимает O(1), а удаление из середины (Pop intermediate, Delete Item) занимает O(n).

Мы замерили модулем timeit на списке и очереди deque из 100 000 чисел, Python 3.14, Apple M4 Pro, три прогона:

Операция 10 000 вызовов
a.pop() 0,11–0,15 мс
a.pop(0) 111–118 мс
deque.popleft() 0,11–0,13 мс

Разница почти в тысячу раз. Если программа постоянно забирает элементы с начала, как очередь задач, возьмите collections.deque: у неё быстрое удаление с обоих концов.

Второй замер на списке из 20 000 случайных цифр: убрать все нули через while 0 in d: d.remove(0) заняло 188–197 мс, а генератором списка 0,17 мс. Цикл с remove() по всем вхождениям медленный, потому что каждый вызов заново ищет значение с начала списка.

Массив NumPy и функция np.delete()

Массивы NumPy часто называют просто массивами, и методов remove() и pop() у них нет. Удаляют функцией np.delete(), и она не меняет исходный массив, а возвращает новый:

import numpy as np
arr = np.array([5, 6, 7, 8])
new = np.delete(arr, 1)
print(arr, new)               # [5 6 7 8] [5 7 8]
print(np.delete(arr, [0, 2])) # [6 8]
print(arr[arr != 7])          # [5 6 8] — по значению через маску

В документации NumPy сказано, что вместо np.delete() часто удобнее булева маска, как в последней строке.

Частые ошибки и что с ними делать

Рой доволен: программа отработала без ошибок
Симптом Причина Решение
ValueError: list.remove(x): x not in list Значения в списке нет Проверить через in или обернуть в try
IndexError: pop index out of range Индекс больше длины или список пуст Проверить if a: и len(a)
Переменная стала None Написали a = a.remove(x), а метод возвращает None Вызывать a.remove(x) без присваивания
Удалилась только одна копия remove() берёт первое совпадение Генератор списка
В цикле часть элементов осталась Список меняется во время обхода Обходить копию a[:] или собирать новый список
Удалились не те элементы по индексам Сдвиг после каждого удаления Удалять по убыванию индексов

Где освоить Python системно

Удаление элементов входит в десятки базовых операций со списками, словарями и строками, которые нужны в любой программе. Похожая короткая инструкция есть про то, как суммировать список в Python.

Если хочется пройти язык целиком, с практикой и проверкой домашних заданий, сравните программы в каталоге курсов по Python по цене, длительности и отзывам. А тем, кто думает о смене профессии, пригодится разбор, как стать Python-разработчиком.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Профессия «Python-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология161 200 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox118 666 ₽4108 ₽/мес.9 месяцевОбзор курса
Программирование на Python ПРО
Перейти на сайт курса
SkillboxSkillbox119 600 ₽ - 17 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Как удалить элемент из списка по значению в Python?

Вызовите список.remove(значение). Метод удаляет только первое совпадение, а если значения в списке нет, выбрасывает ValueError, поэтому перед вызовом удобно проверить его через in.

Как удалить элемент списка по индексу?

Если удалённый элемент нужен дальше, используйте список.pop(индекс): метод вернёт его. Если не нужен, подойдёт del список[индекс], он же умеет удалять срезы вроде del список[1:3].

Как удалить последний элемент списка в Python?

Вызовите pop() без аргумента или напишите del список[-1]. Удаление с конца быстрое, сдвигать остальные элементы не нужно.

Как удалить из списка все одинаковые элементы?

Соберите новый список генератором: [x for x in data if x != значение]. Цикл с remove() тоже сработает, но в нашем замере на 20 000 элементах он оказался медленнее генератора больше чем в тысячу раз, потому что каждый вызов ищет значение с начала.

Чем clear() отличается от присваивания пустого списка?

clear() опустошает сам список, и это видят все переменные, которые на него ссылаются. Присваивание a = [] создаёт новый объект, а старый список с данными остаётся в других переменных.

Как убрать дубликаты из списка и сохранить порядок?

Используйте list(dict.fromkeys(список)). Словарь хранит ключи в порядке добавления, поэтому повторы исчезнут, а порядок первых вхождений сохранится. set() тоже убирает повторы, но порядок не гарантирует.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!