Różnica między listami del, remove i pop na listach


Odpowiedzi:


1328

Tak, removeusuwa pierwszą pasującą wartość , a nie konkretny indeks:

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

del usuwa element pod określonym indeksem:

>>> a = [9, 8, 7, 6]
>>> del a[1]
>>> a
[9, 7, 6]

i popusuwa element pod określonym indeksem i zwraca go.

>>> a = [4, 3, 5]
>>> a.pop(1)
3
>>> a
[4, 5]

Ich tryby błędów również są różne:

>>> 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: delto nie jest przechowywanie składni, nie. Składnia jest niezmieniona, podobnie jak returnlub iflub while.
Martijn Pieters

6
Warto wspomnieć, że użytkownicy powinni zachować ostrożność podczas iteracji nad listą i korzystania z tych funkcji na niej w tym samym czasie, gdy iterują.
hamaney

16
Ten delprzykład jest nieco mylący. Który element jest dokładnie usuwany? 2. czy 3.? Powinieneś był użyć [9, 8, 7, 6], del a[1]i[9, 7, 6]
gromit190

2
@ rite2hhh testuje równość. Testy równości najpierw sprawdzają tożsamość jako optymalizację
Martijn Pieters

1
@ rite2hhh: równość wartości jest ujęta w odwołaniu do wyrażenia .
Martijn Pieters

183

Użyj, delaby usunąć element według indeksu, pop()aby usunąć go według indeksu, jeśli potrzebujesz zwróconej wartości, i remove()aby usunąć element według wartości. Ten ostatni wymaga przeszukania listy i podnosi, ValueErrorjeśli taka wartość nie występuje na liście.

Podczas usuwania indeksu iz listy nelementów złożoność obliczeniowa tych metod wynosi

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

1
Czy pop wymaga przeszukania listy
sachin irukula

31
+1 za podział złożoności. Ilustruje stałą usuwania i popu, gdy element znajduje się na końcu listy.
Big Sharpie

2
Pamiętajcie, chłopaki ... wszystko oparte na indeksie jest jednym strzałem O (n-1) ... jeśli musisz przeprowadzić wyszukiwanie (według wartości), przejdzie ono przez kolekcję, aż element zostanie znaleziony.
Pepito Fernandez

2
@PepitoFernandez Wyszukiwanie według indeksu na liście to O (1) w Pythonie. (Lista w Pythonie jest podobna do wektora w C ++.)
Sven Marnach

3
@PlasmaBinturong Powinieneś używać tego, co uważasz za bardziej czytelne, chyba że masz dane, które dowodzą, że wydajność ma znaczenie. A jeśli masz, musisz zmierzyć, co jest szybsze w konkretnym przypadku. Sądzę również, że deljest to nieco szybsze, ale z innego powodu: wyszukiwanie __delitem__typu zaimplementowanego w C odbywa się raczej za pomocą indeksu niż nazwy, podczas gdy popnależy sprawdzić w oparciu o cały protokół deskryptora. Wykonanie samych funkcji powinno zająć tyle samo czasu. Oba zwracają wskaźnik - jeden do usuniętego obiektu, drugi do None.
Sven Marnach

91

Ponieważ nikt o tym nie wspominał, zwróć uwagę, że del(w przeciwieństwie do pop) pozwala na usunięcie szeregu indeksów z powodu dzielenia listy:

>>> lst = [3, 2, 2, 1]
>>> del lst[1:]
>>> lst
[3]

Pozwala to również uniknąć sytuacji, IndexErrorgdy indeksu nie ma na liście:

>>> lst = [3, 2, 2, 1]
>>> del lst[10:]
>>> lst
[3, 2, 2, 1]

55

Odpowiedzieli już inni. Ten z mojego końca :)

usuń vs pop vs del

Najwyraźniej popjest jedynym, który zwraca wartość i removejest jedynym, który przeszukuje obiekt, delograniczając się do prostego usunięcia.


2
Dziękuję! Jedna uwaga: w pythonie, ze względu na sposób implementacji list (są tam praktycznie tablice ...!), „Przejdź do tej pozycji węzła” to O (1)
ntg

19

Istnieje wiele najlepszych wyjaśnień, ale postaram się jak najlepiej uprościć.

Spośród wszystkich tych metod, odwrotność i pop to postfiks, podczas gdy delete to prefiks .

remove (): Służy do usuwania pierwszego wystąpienia elementu

remove(i) => pierwsze wystąpienie wartości 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 (): Służył do usuwania elementu, jeśli:

nieokreślony

pop() => od końca listy

>>>a.pop()
>>>a
[0, 3, 2, 1, 4, 6, 5]

określony

pop(index) => indeksu

>>>a.pop(2)
>>>a
[0, 3, 1, 4, 6, 5]

OSTRZEŻENIE: Niebezpieczna metoda przed nami

delete () : Jest to metoda przedrostka.

Obserwuj dwie różne składnie tej samej metody: [] i (). Posiada moc do:

1.Usuń indeks

del a[index] => służy do usuwania indeksu i powiązanej z nim wartości, podobnie jak pop.

>>>del a[1]
>>>a
[0, 1, 4, 6, 5]

2.Usuń wartości z zakresu [indeks 1: indeks N]

del a[0:3] => wiele wartości w zakresie

>>>del a[0:3]
>>>a
[6, 5]

3.Ostatnia, ale nie lista, aby usunąć całą listę w jednym ujęciu

del (a) => jak powiedziano powyżej.

>>>del (a)
>>>a

Mam nadzieję, że to wyjaśni zamieszanie, jeśli w ogóle.


18

pop - przyjmuje indeks i zwraca wartość

remove - Pobiera wartość, usuwa pierwsze wystąpienie i nic nie zwraca

delete - pobiera indeks, usuwa wartość pod tym indeksem i nic nie zwraca


2

Każda operacja / funkcja na różnych strukturach danych jest zdefiniowana dla poszczególnych działań. Tutaj w twoim przypadku, tj. Usunięcie elementu, usuń, pop i usuń. (Jeśli weźmiesz pod uwagę zestawy, dodaj kolejną operację - odrzuć) Innym mylącym przypadkiem jest dodanie. Wstaw / dołącz. Dla celów demonstracyjnych zastosujmy deque. deque to hybrydowa liniowa struktura danych, w której można dodawać elementy / usuwać elementy z obu końców. (tył i przód)

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

Tutaj zobacz operacje:

def deleteFront(self):

    return self.items.pop(0)
def deleteRear(self):
    return self.items.pop()

Operacje muszą coś zwrócić. Tak więc pop - z indeksem i bez. Jeśli nie chcę zwracać wartości: del self.items [0]

Usuń według wartości, a nie indeksu:

  • usuń:

    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

Zwroty [1,3,5,7]

rozważmy przypadek zbiorów.

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

Podczas pop i usuń oba wziąć indeksy, aby usunąć element, jak podano w powyższych komentarzach. Kluczową różnicą jest dla nich złożoność czasu. Złożoność czasu dla pop () bez indeksu wynosi O (1), ale nie jest tak samo w przypadku usuwania ostatniego elementu.

Jeśli twoim przypadkiem użycia jest zawsze usunięcie ostatniego elementu, zawsze lepiej jest użyć pop () niż delete (). Więcej wyjaśnień dotyczących zawiłości czasowych można znaleźć na stronie https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt


2
Jest to złe na wiele sposobów. Nie ma takiej metody jak delete. Różnice polegają na tym, że popzwraca wartość i deldziała na plasterki. W przypadkach, w których popdziała, delma dokładnie taką samą złożoność obliczeniową (i jest nieco szybszy o stały składnik).
abarnert

1

Operacja usuwania na liście otrzymuje wartość do usunięcia. Przeszukuje listę, aby znaleźć element o tej wartości, i usuwa pierwszy pasujący znaleziony element. Jest to błąd, jeśli nie ma pasującego elementu, powoduje błąd 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

Za pomocą instrukcji del można usunąć całą listę. Jeśli masz określony element listy jako argument do usunięcia (np. Nazwa listy [7], aby konkretnie odwoływać się do ósmego elementu na liście), po prostu usunie ten element. Możliwe jest nawet usunięcie „plasterka” z listy. Jest to błąd, jeśli indeks jest poza zakresem, podnosi błąd 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

Zwykle używa się popu do usunięcia ostatniego elementu z listy, gdy używasz listy jako stosu. W przeciwieństwie do del, pop zwraca wartość, która spadła z listy. Opcjonalnie możesz podać wartość indeksu dla pop i pop z innego niż koniec listy (np. Listname.pop (0) usunie pierwszy element z listy i zwróci ten pierwszy element jako wynik). Możesz użyć tego, aby lista zachowywała się jak kolejka, ale dostępne są procedury biblioteczne, które mogą zapewnić operacje w kolejce z lepszą wydajnością niż pop (0). Jest to błąd, jeśli indeks jest poza zakresem, podnosi błąd 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

Zobacz kolekcje.deque po więcej szczegółów.


-1

Usuń zasadniczo działa na wartości. Usuń i pop pracy na indeksie

Usuń zasadniczo usuwa pierwszą pasującą wartość. Usuń usuwa element z określonego indeksu. Pop zasadniczo pobiera indeks i zwraca wartość pod tym indeksem. Następnym razem, gdy wydrukujesz listę, wartość nie pojawi się.

Przykład:


3
Chociaż dziękujemy za odpowiedź, byłoby lepiej, gdyby stanowiła dodatkową wartość oprócz innych odpowiedzi. W takim przypadku twoja odpowiedź nie zapewnia dodatkowej wartości, ponieważ inni użytkownicy objęli wszystko, co podałeś w odpowiedzi. Jako dodatkowy problem, nie dołączaj tekstu jako obrazka, kiedy możesz go wkleić jako tekst. Jeśli poprzednia odpowiedź była dla ciebie pomocna, powinieneś ją zagłosować .
David Buck

-3

Możesz także użyć opcji usuń, aby usunąć wartość według indeksu.

n = [1, 3, 5]

n.remove(n[1])

n odnosi się wtedy do [1, 5]


43
Spróbuj n = [5, 3, 5]więc n.remove(n[2]).
abarnert

@ abarnert Twój przypadek użycia działa w synchronizacji z poniższym przypadkiem n = [5,3,5], a następnie n.remove (5). Oba usuwają pierwszy napotkany element z listy.
Akhil Ghatiki

@AkhilGhatiki n.remove(n[2])usuwa n[0], a nie n[2]. Więc to nie tylko czas liniowy bez powodu (może nie jest to wielka sprawa, gdy N = 3), ale także źle (duża sprawa bez względu na to, co N)
abarnert
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.