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


930
>>> 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]
>>> 

Есть ли разница между тремя вышеупомянутыми способами удаления элемента из списка?


1
Связанный пост на похожих строках для заданной структуры данных - Разница во времени выполнения между методами set.discard и set.remove в Python?
RBT

Ответы:


1335

Да, removeудаляет первое совпадающее значение , а не конкретный индекс:

>>> a = [0, 2, 3, 2]
>>> a.remove(2)
>>> a
[0, 3, 2]

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

>>> a = [9, 8, 7, 6]
>>> del a[1]
>>> a
[9, 7, 6]

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

>>> a = [4, 3, 5]
>>> a.pop(1)
3
>>> a
[4, 5]

Их режимы ошибок тоже разные:

>>> a = [4, 5, 6]
>>> a.remove(7)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
>>> del a[7]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> a.pop(7)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: pop index out of range

14
@jxramos: delнет удержания синтаксиса, нет. Синтаксис неизменен, как и returnили ifили while.
Мартин Питерс

6
Стоит отметить, что пользователи должны быть осторожны при переборе списка и использовании этих функций в нем одновременно с перебором.
hamaney

16
delПример несколько вводит в заблуждение. Какой именно элемент удален? 2-й или 3-й? Вы должны были использовать [9, 8, 7, 6], del a[1]и[9, 7, 6]
gromit190

2
@ rite2hhh это проверяет на равенство. Тесты на равенство проверяют идентичность сначала как оптимизацию
Мартейн Питерс

1
@ rite2hhh: равенство значений рассматривается в ссылке на выражение .
Мартин Питерс

184

Используйте delдля удаления элемента по индексу, pop()для удаления его по индексу, если вам нужно возвращаемое значение, и remove()для удаления элемента по значению. Последний требует поиска в списке и повышается, ValueErrorесли в списке нет такого значения.

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

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

1
Нужен ли поп поиск в списке
sachin irukula

31
+1 за разбивку сложности. Иллюстрирует, как delete и pop постоянны, когда элемент находится в конце списка.
Большой Шарпи

2
Помните, ребята ... все, что основано на индексе, это один выстрел O (n-1) ... если вам нужно выполнить поиск (по значению), он будет проходить по коллекции, пока не будет найден элемент.
Пепито Фернандес

2
@PepitoFernandez Поиск по индексу в списке - O (1) в Python. (Список в Python похож на вектор в C ++.)
Свен Марнах

3
@PlasmaBinturong Вы должны использовать то, что считаете более читабельным, если только у вас нет данных, подтверждающих, что производительность имеет значение. И если у вас есть, вам нужно измерить, что быстрее в вашем конкретном случае. Я также думаю, что delэто немного быстрее, но по другой причине: поиск __delitem__типа, реализованного в C, происходит по индексу, а не по имени, в то время как его popнужно искать, следуя всему протоколу дескриптора. Выполнение самих функций должно занимать столько же времени. Оба возвращают указатель - один на удаленный объект, другой на None.
Свен Марнач

92

Поскольку никто другой не упомянул об этом, обратите внимание, что 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]

55

Уже неплохо ответили другие. Это с моего конца :)

удалить против поп против дель

Очевидно, popэто единственный, который возвращает значение, и removeединственный, который ищет объект, но delограничивается простым удалением.


2
Thnx! Одно замечание: в python, из-за того, как реализованы списки (там практически массивы ...!), «Продвижение до этой позиции узла» равно O (1)
ntg

19

pop - берет индекс и возвращает значение

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

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


19

Многие лучшие объяснения здесь, но я постараюсь сделать все возможное, чтобы упростить еще.

Среди всех этих методов reverse & pop - это постфикс, а delete - префикс .

remove (): используется для удаления первого вхождения элемента

remove(i) => первое вхождение значения i

>>> a = [0, 2, 3, 2, 1, 4, 6, 5, 7]
>>> a.remove(2)   # where 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]

ВНИМАНИЕ: впереди опасный метод

delete () : это префиксный метод.

Следите за двумя различными синтаксисами для одного и того же метода: [] и (). Он обладает способностью:

1. Удалить индекс

del a[index] => используется для удаления индекса и связанного с ним значения так же, как pop.

>>>del a[1]
>>>a
[0, 1, 4, 6, 5]

2. Удалить значения в диапазоне [индекс 1: индекс N]

del a[0:3] => несколько значений в диапазоне

>>>del a[0:3]
>>>a
[6, 5]

3.Последний, но не список, чтобы удалить весь список за один раз

del (a) => как сказано выше.

>>>del (a)
>>>a

Надеюсь, что это проясняет путаницу, если таковые имеются.


2

Любая операция / функция в различных структурах данных определяется для конкретных действий. Вот в вашем случае т.е. удаление элемента, удаление, выскочить и удалить. (Если вы рассматриваете наборы, добавьте еще одну операцию - отбросьте) Другой запутанный случай - при добавлении. Вставка / Append. Для демонстрации, давайте введем deque. deque - это гибридная линейная структура данных, в которую можно добавлять элементы / удалять элементы с обоих концов (задний и передний концы).

class Deque(object):

  def __init__(self):

    self.items=[]

  def addFront(self,item):

    return self.items.insert(0,item)
  def addRear(self,item):

    return self.items.append(item)
  def deleteFront(self):

    return self.items.pop(0)
  def deleteRear(self):
    return self.items.pop()
  def returnAll(self):

    return self.items[:]

Здесь, см. Операции:

def deleteFront(self):

    return self.items.pop(0)
def deleteRear(self):
    return self.items.pop()

Шеф должен что-то вернуть. Итак, поп - с индексом и без. Если я не хочу возвращать значение: del self.items [0]

Удалить по значению, а не по индексу:

  • Удалить :

    list_ez=[1,2,3,4,5,6,7,8]
    for i in list_ez:
        if i%2==0:
            list_ez.remove(i)
    print list_ez

Возвращает [1,3,5,7]

рассмотрим случай множеств.

set_ez=set_ez=set(range(10))

set_ez.remove(11)

# Gives Key Value Error. 
##KeyError: 11

set_ez.discard(11)

# Does Not return any errors.

1

В то время как pop и delete оба принимают индексы для удаления элемента, как указано в комментариях выше. Ключевым отличием является сложность времени для них. Временная сложность для pop () без индекса равна O (1), но это не тот же случай для удаления последнего элемента.

Если ваш вариант использования всегда заключается в удалении последнего элемента, всегда лучше использовать pop (), а не delete (). Для получения дополнительной информации о временных сложностях вы можете обратиться к https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt.


2
Это неправильно несколькими способами. Нет такого метода как delete. Различия в том, что popвозвращает значение и delработает на срезах. В тех случаях, когда popработает, delимеет точно такую ​​же вычислительную сложность (и немного быстрее на постоянный член).
Абарнерт

1

Операция удаления в списке получает значение для удаления. Он ищет в списке, чтобы найти элемент с этим значением, и удаляет первый соответствующий элемент, который он находит. Это ошибка, если нет соответствующего элемента, вызывает ValueError .

>>> x = [1, 0, 0, 0, 3, 4, 5]
>>> x.remove(4)
>>> x
[1, 0, 0, 0, 3, 5]
>>> del x[7]
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    del x[7]
IndexError: list assignment index out of range

Оператор del может использоваться для удаления всего списка. Если у вас есть определенный элемент списка в качестве аргумента для del (например, listname [7] для конкретной ссылки на восьмой элемент в списке), он просто удалит этот элемент. Можно даже удалить «ломтик» из списка. Это ошибка, если индекс выходит за пределы допустимого диапазона, вызывает ошибку IndexError .

>>> x = [1, 2, 3, 4]
>>> del x[3]
>>> x
[1, 2, 3]
>>> del x[4]
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    del x[4]
IndexError: list assignment index out of range

Обычное использование pop - удалить последний элемент из списка, когда вы используете список в качестве стека. В отличие от del, pop возвращает значение, которое он вытолкнул из списка. При желании вы можете задать значение индекса для pop и pop, отличное от конца списка (например, listname.pop (0) удалит первый элемент из списка и вернет этот первый элемент в качестве результата). Вы можете использовать это, чтобы список вел себя как очередь, но есть доступные библиотечные подпрограммы, которые могут обеспечить работу очереди с большей производительностью, чем pop (0). Это ошибка, если индекс выходит за пределы допустимого диапазона, вызывает ошибку IndexError .

>>> x = [1, 2, 3] 
>>> x.pop(2) 
3 
>>> x 
[1, 2]
>>> x.pop(4)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    x.pop(4)
IndexError: pop index out of range

См. Collection.deque для более подробной информации.


-1

Удалить в основном работает на стоимость. Удалить и вспомнить работу над индексом

Удалить в основном удаляет первое совпадающее значение. Удалить удаляет элемент из определенного индекса. Pop обычно берет индекс и возвращает значение по этому индексу. В следующий раз, когда вы распечатаете список, значение не появится.

Пример:


3
Хотя мы благодарим вас за ваш ответ, было бы лучше, если бы он предоставил дополнительную ценность поверх других ответов. В этом случае ваш ответ не дает дополнительной ценности, поскольку другие пользователи покрывали все, что вы включили в свой ответ. В качестве дополнительной проблемы, пожалуйста, не включайте текст в виде картинок, когда вы можете вставить его как текст. Если предыдущий ответ был вам полезен, вы должны проголосовать за него .
Дэвид Бак

-3

Вы также можете использовать команду remove для удаления значения по индексу.

n = [1, 3, 5]

n.remove(n[1])

Тогда n будет ссылаться на [1, 5]


43
Попробуй n = [5, 3, 5]тогда n.remove(n[2]).
abarnert

@abarnert ваш вариант использования работает синхронно с приведенным ниже случаем n = [5,3,5], затем n.remove (5). Оба они удаляют первый встреченный элемент из списка.
Ахил Гатики

@AkhilGhatiki n.remove(n[2])удаляет n[0], а не n[2]. Так что это не просто линейное время без причины (может быть, это не так важно, когда N = 3), это также неправильно (большое дело, независимо от того, что такое N)
abarnert
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.