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



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


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

587   10  

10 ответов:

да remove снимает первый соответствующего стоимостью, а не конкретный показатель:

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

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

>>> a = [3, 2, 2, 1]
>>> del a[1]
>>> a
[3, 2, 1]

и 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

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

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

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

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

уже ответил довольно хорошо другими. Это один из моего конца:)

remove vs pop vs del

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

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

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

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

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

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

любая операция / функция на различных структурах данных определяется для конкретных действий. Вот в вашем случае, т. е. удаление элемента, удаление, поп и удалить. (Если вы рассматриваете наборы, добавьте еще одну операцию-отбросить) Другой запутанный случай-при добавлении. Вставить / Добавить. Для демонстрации давайте осуществления двухсторонней очереди. 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()

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

The удалить операции в списке присваивается значение для удаления. Он ищет в списке элемент с этим значением и удаляет первый соответствующий элемент, который он находит. Это ошибка, если нет соответствующего элемента, вызывает 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

The del оператор может быть использован для удаления всего списка. Если у вас есть конкретный элемент списка в качестве аргумента для del (например, listname[7] для конкретной ссылки на 8-й элемент в списке), он просто удалит этот элемент. Можно даже удалить "срез" из списка. Это ошибка, если есть индекс вне диапазона, поднимает 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

использовать поп удалить последний элемент из списка, как вы используете список в качестве стека. В отличие от 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

посмотреть коллекций.дек для более подробной информации.

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

среди всех этих методов, обратный & pop являются постфикс в то время как удалить префикс.

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

remove(i) = > первое вхождение I value

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

внимание: Опасный метод впереди

удалить(): его префиксный метод.

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

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

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

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

n = [1, 3, 5]

n.remove(n[1])

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

Comments

    Ничего не найдено.