>>> 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]
>>>
Есть ли разница между тремя вышеупомянутыми способами удаления элемента из списка?
>>> 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]
>>>
Есть ли разница между тремя вышеупомянутыми способами удаления элемента из списка?
Ответы:
Да, 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
del
нет удержания синтаксиса, нет. Синтаксис неизменен, как и return
или if
или while
.
del
Пример несколько вводит в заблуждение. Какой именно элемент удален? 2-й или 3-й? Вы должны были использовать [9, 8, 7, 6]
, del a[1]
и[9, 7, 6]
Используйте del
для удаления элемента по индексу, pop()
для удаления его по индексу, если вам нужно возвращаемое значение, и remove()
для удаления элемента по значению. Последний требует поиска в списке и повышается, ValueError
если в списке нет такого значения.
При удалении индекса i
из списка n
элементов вычислительные сложности этих методов
del O(n - i)
pop O(n - i)
remove O(n)
del
это немного быстрее, но по другой причине: поиск __delitem__
типа, реализованного в C, происходит по индексу, а не по имени, в то время как его pop
нужно искать, следуя всему протоколу дескриптора. Выполнение самих функций должно занимать столько же времени. Оба возвращают указатель - один на удаленный объект, другой на None
.
Поскольку никто другой не упомянул об этом, обратите внимание, что 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]
Уже неплохо ответили другие. Это с моего конца :)
Очевидно, pop
это единственный, который возвращает значение, и remove
единственный, который ищет объект, но del
ограничивается простым удалением.
pop - берет индекс и возвращает значение
удалить - принимает значение, удаляет первое вхождение и ничего не возвращает
delete - принимает индекс, удаляет значение по этому индексу и ничего не возвращает
Многие лучшие объяснения здесь, но я постараюсь сделать все возможное, чтобы упростить еще.
Среди всех этих методов 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
Надеюсь, что это проясняет путаницу, если таковые имеются.
Любая операция / функция в различных структурах данных определяется для конкретных действий. Вот в вашем случае т.е. удаление элемента, удаление, выскочить и удалить. (Если вы рассматриваете наборы, добавьте еще одну операцию - отбросьте) Другой запутанный случай - при добавлении. Вставка / 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
рассмотрим случай множеств.
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.
В то время как pop и delete оба принимают индексы для удаления элемента, как указано в комментариях выше. Ключевым отличием является сложность времени для них. Временная сложность для pop () без индекса равна O (1), но это не тот же случай для удаления последнего элемента.
Если ваш вариант использования всегда заключается в удалении последнего элемента, всегда лучше использовать pop (), а не delete (). Для получения дополнительной информации о временных сложностях вы можете обратиться к https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt.
delete
. Различия в том, что pop
возвращает значение и del
работает на срезах. В тех случаях, когда pop
работает, del
имеет точно такую же вычислительную сложность (и немного быстрее на постоянный член).
Операция удаления в списке получает значение для удаления. Он ищет в списке, чтобы найти элемент с этим значением, и удаляет первый соответствующий элемент, который он находит. Это ошибка, если нет соответствующего элемента, вызывает 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 для более подробной информации.
Удалить в основном работает на стоимость. Удалить и вспомнить работу над индексом
Удалить в основном удаляет первое совпадающее значение. Удалить удаляет элемент из определенного индекса. Pop обычно берет индекс и возвращает значение по этому индексу. В следующий раз, когда вы распечатаете список, значение не появится.
Вы также можете использовать команду remove для удаления значения по индексу.
n = [1, 3, 5]
n.remove(n[1])
Тогда n будет ссылаться на [1, 5]
n = [5, 3, 5]
тогда n.remove(n[2])
.
n.remove(n[2])
удаляет n[0]
, а не n[2]
. Так что это не просто линейное время без причины (может быть, это не так важно, когда N = 3), это также неправильно (большое дело, независимо от того, что такое N)