12

Разница между del, remove и pop в списках Python

8

Есть ли разница между этими тремя методами удаления элемента из списка в 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 ответ(ов)

16

Методы remove, del и pop в Python служат для удаления элементов из списка, но работают по-разному:

  1. remove удаляет первое совпадение значения, а не конкретный индекс. Например:

    a = [0, 2, 3, 2]
    a.remove(2)
    print(a)  # Вывод: [0, 3, 2]
    
  2. del удаляет элемент по определенному индексу:

    a = [9, 8, 7, 6]
    del a[1]
    print(a)  # Вывод: [9, 7, 6]
    
  3. 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
    

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

2

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

При удалении элемента с индексом i из списка, содержащего n элементов, вычислительные сложности этих методов следующие:

del     O(n - i)
pop     O(n - i)
remove  O(n)

Таким образом, использование del и pop() эффективно, когда вы работаете с индексами, тогда как remove() стоит применять только для удаления по значению.

1

Стоит отметить, что 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 в сочетании с срезами может быть более гибким и безопасным подходом для удаления элементов из списка.

0

Много хороших объяснений уже представлено, но я постараюсь упростить информацию еще больше.

Среди всех этих методов 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

Надеюсь, это проясняет путаницу.

0

pop

Принимает индекс (если задан, иначе берёт последний), удаляет значение по указанному индексу и возвращает это значение.

remove

Принимает значение, удаляет первое его вхождение и ничего не возвращает.

delete

Принимает индекс, удаляет значение по этому индексу и ничего не возвращает.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь