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