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

Пять инструментов решают пять разных задач. Главное отличие в том, что вы передаёте и что получаете обратно.
| Задача | Способ | Что возвращает | Если элемента нет |
|---|---|---|---|
| Удалить по значению первое совпадение | 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']
Как очистить список целиком
Три записи выглядят похоже, но ведут себя по-разному:
a.clear()иdel a[:]опустошают сам список. В документации Pythonclear()описан как аналогdel a[:].a = []создаёт новый пустой список, а старый остаётся жить в других переменных.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.
Почему цикл 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-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 161 200 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 118 666 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Программирование на Python ПРО Перейти на сайт курса | 119 600 ₽ | - | 17 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




