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

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

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

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

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

>>> a = [3, 2, 2, 1]
>>> del a[1]
[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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

Уже хорошо ответил. Это с моей стороны:)

удалить vs pop vs del

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

n = [1, 3, 5]

n.remove(n[1])

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