Разница между del, remove и pop в списках Python
Есть ли разница между этими тремя методами удаления элемента из списка в Python?
a = [1, 2, 3]
a.remove(2)
a # [1, 3]
a = [1, 2, 3]
del a[1]
a # [1, 3]
a = [1, 2, 3]
a.pop(1) # 2
a # [1, 3]
5 ответ(ов)
Методы remove
, del
и pop
в Python служат для удаления элементов из списка, но работают по-разному:
remove
удаляет первое совпадение значения, а не конкретный индекс. Например:a = [0, 2, 3, 2] a.remove(2) print(a) # Вывод: [0, 3, 2]
del
удаляет элемент по определенному индексу:a = [9, 8, 7, 6] del a[1] print(a) # Вывод: [9, 7, 6]
pop
также удаляет элемент по индексу, но в отличие отdel
, он возвращает удаленное значение:a = [4, 3, 5] удаленное_значение = a.pop(1) print(удаленное_значение) # Вывод: 3 print(a) # Вывод: [4, 5]
У каждого метода есть свои особенности обработки ошибок:
При использовании
remove
и передаче значения, которого нет в списке, возникает сообщение об ошибкеValueError
:a = [4, 5, 6] a.remove(7) # ValueError: list.remove(x): x not in list
При использовании
del
с индексом, выходящим за пределы списка, вы получите ошибкуIndexError
:del a[7] # IndexError: list assignment index out of range
При использовании
pop
с индексом, выходящим за пределы списка, также возникнетIndexError
:a.pop(7) # IndexError: pop index out of range
Таким образом, выбор метода зависит от ваших требований: хотите ли вы удалить элемент по значению, по индексу или вернуть удаляемый элемент.
Для удаления элемента из списка по индексу в Python можно использовать del
, для удаления элемента по индексу с получением его значения — pop()
, а для удаления элемента по значению — remove()
. Обратите внимание, что в случае с remove()
происходит поиск значения в списке, и если указанное значение не найдено, будет вызвано исключение ValueError
.
При удалении элемента с индексом i
из списка, содержащего n
элементов, вычислительные сложности этих методов следующие:
del O(n - i)
pop O(n - i)
remove O(n)
Таким образом, использование del
и pop()
эффективно, когда вы работаете с индексами, тогда как remove()
стоит применять только для удаления по значению.
Стоит отметить, что del
(в отличие от pop
) позволяет удалять диапазоны индексов благодаря срезам списков:
>>> lst = [3, 2, 2, 1]
>>> del lst[1:]
>>> lst
[3]
Это также помогает избежать ошибки IndexError
, если индекс не присутствует в списке:
>>> lst = [3, 2, 2, 1]
>>> del lst[10:]
>>> lst
[3, 2, 2, 1]
Таким образом, использование del
в сочетании с срезами может быть более гибким и безопасным подходом для удаления элементов из списка.
Много хороших объяснений уже представлено, но я постараюсь упростить информацию еще больше.
Среди всех этих методов remove
и pop
являются постфиксными, в то время как del
- префиксным.
remove()
: Используется для удаления первого вхождения элемента.
remove(n)
⇒ удаляет первое вхождение n
в списке.
>>> a = [0, 2, 3, 2, 1, 4, 6, 5, 7]
>>> a.remove(2) # где i = 2
>>> a
[0, 3, 2, 1, 4, 6, 5, 7]
pop()
: Используется для удаления элемента...
- если индекс не указан:
pop()
⇒ удаляет с конца списка.
>>> a.pop()
>>> a
[0, 3, 2, 1, 4, 6, 5]
- если индекс указан:
pop(index)
⇒ удаляет элемент по указанному индексу.
>>> a.pop(2)
>>> a
[0, 3, 1, 4, 6, 5]
ПРЕДУПРЕЖДЕНИЕ: Опасный метод впереди
del()
: Это префиксный метод.
Обратите внимание на два разных синтаксиса для одного и того же метода: с []
и без него. Он имеет возможность:
- Удалить по индексу
del a[index]
⇒ используется для удаления элемента по индексу и его связанного значения, как pop
.
>>> del a[1]
>>> a
[0, 1, 4, 6, 5]
- Удалить значения в диапазоне
[index_1:index_N]
:
del a[0:3]
⇒ удаляет несколько значений в указанном диапазоне.
>>> del a[0:3]
>>> a
[6, 5]
- И напоследок, удалить весь список сразу.
del (a)
⇒ как было сказано выше.
>>> del (a)
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
Надеюсь, это проясняет путаницу.
pop
Принимает индекс (если задан, иначе берёт последний), удаляет значение по указанному индексу и возвращает это значение.
remove
Принимает значение, удаляет первое его вхождение и ничего не возвращает.
delete
Принимает индекс, удаляет значение по этому индексу и ничего не возвращает.
Почему используется string.join(list), а не list.join(string)?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Как вернуть ключи словаря в виде списка в Python?
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе
Как преобразовать строковое представление списка в список?