Різниця між del, Remove та pop у списках


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

Відповіді:


1328

Так, 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.
Martijn Pieters

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

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

2
@ rite2hhh це тестує на рівність. Тест рівності спочатку тест на особистість як оптимізація
Martijn Pieters

1
@ rite2hhh: рівність значення охоплюється в посиланні виразу .
Martijn Pieters

183

Використовуйте delдля видалення елемента за індексом, pop()для видалення його за індексом, якщо вам потрібно повернене значення, та remove()для видалення елемента за значенням. Останнє вимагає пошуку в списку, і збільшується, ValueErrorякщо такого значення в списку немає.

При видаленні індексу iзі списку nелементів обчислювальна складність цих методів є

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

1
Чи потрібен поп пошук у списку
sachin irukula

31
+1 для розбиття складності. Ілюструє, як видалення та поп є постійними, коли елемент знаходиться в кінці списку.
Великий Шарпі

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

2
@PepitoFernandez Шукання за індексом у списку є O (1) на Python. (Список у Python схожий на вектор у C ++.)
Sven Marnach

3
@PlasmaBinturong Ви повинні використовувати те, що, на вашу думку, читабельніше, якщо у вас немає даних, які підтверджують, що ефективність має значення. І якщо у вас є, вам потрібно виміряти, що швидше у вашому конкретному випадку. Моя здогадка також, що delце трохи швидше, але з іншої причини: пошук для __delitem__типу, реалізованого в C, відбувається за індексом, а не за назвою, тоді як popйого потрібно шукати за всім протоколом дескриптора. Виконання самих функцій повинно зайняти стільки ж часу. Обидва повертають вказівник - один на видалений об’єкт, інший на None.
Sven Marnach

91

Оскільки ніхто більше не згадував про це, зауважте, що 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

Тут є багато найкращих пояснень, але я постараюся зробити все, щоб спростити більше.

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

delete (): використовується для видалення першого появи елемента

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] => використовується для видалення індексу та пов'язаного з ним значення, як і поп.

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

Сподіваюсь, це прояснить плутанину, якщо така є.


18

pop - Бере індекс і повертає значення

delete - приймає значення, видаляє перше виникнення і нічого не повертає

delete - Бере індекс, видаляє значення цього індексу і нічого не повертає


2

Будь-яка операція / функція в різних структурах даних визначається для конкретних дій. Тут, у вашому випадку, тобто видалення елемента, видалення, виведення та видалення. (Якщо ви розглядаєте набори, додайте ще одну операцію - відмовтеся) Додавання іншої заплутаної справи. Вставити / Додати Для демонстрації здійснимо 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 () без індексу становить O (1), але це не той самий випадок для видалення останнього елемента.

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


2
Це неправильно кількома способами. Не існує такого методу, як delete. Відмінності полягають у тому, що popповертає значення і те, що delпрацює на фрагментах. У випадках, коли popпрацює, delмає точно таку ж обчислювальну складність (і трохи швидше постійним терміном).
abarnert

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

Дель заява може бути використана для видалення всього списку. Якщо у вас є аргумент дель (наприклад, 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

Звичайне використання 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

Докладніше див. У колекції.deque .


-1

Видалити в основному працює на значення. Видаліть та виведіть роботу над індексом

Видалити в основному видаляє перше значення, що відповідає. Delete видаляє елемент із певного індексу Pop, в основному, приймає індекс і повертає значення в цьому індексі. Наступного разу, коли ви друкуєте список, значення не з’являється.

Приклад:


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

-3

Ви також можете використовувати delete для видалення значення також за індексом.

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.