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 notin 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
@ 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ę
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
+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:
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)
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.
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
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ę.
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.
@ 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)
Odpowiedzi:
Tak,
remove
usuwa pierwszą pasującą wartość , a nie konkretny indeks:del
usuwa element pod określonym indeksem:i
pop
usuwa element pod określonym indeksem i zwraca go.Ich tryby błędów również są różne:
źródło
del
to nie jest przechowywanie składni, nie. Składnia jest niezmieniona, podobnie jakreturn
lubif
lubwhile
.del
przykł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]
Użyj,
del
aby usunąć element według indeksu,pop()
aby usunąć go według indeksu, jeśli potrzebujesz zwróconej wartości, iremove()
aby usunąć element według wartości. Ten ostatni wymaga przeszukania listy i podnosi,ValueError
jeśli taka wartość nie występuje na liście.Podczas usuwania indeksu
i
z listyn
elementów złożoność obliczeniowa tych metod wynosiźródło
del
jest to nieco szybsze, ale z innego powodu: wyszukiwanie__delitem__
typu zaimplementowanego w C odbywa się raczej za pomocą indeksu niż nazwy, podczas gdypop
należ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 doNone
.Ponieważ nikt o tym nie wspominał, zwróć uwagę, że
del
(w przeciwieństwie dopop
) pozwala na usunięcie szeregu indeksów z powodu dzielenia listy:Pozwala to również uniknąć sytuacji,
IndexError
gdy indeksu nie ma na liście:źródło
Odpowiedzieli już inni. Ten z mojego końca :)
Najwyraźniej
pop
jest jedynym, który zwraca wartość iremove
jest jedynym, który przeszukuje obiekt,del
ograniczając się do prostego usunięcia.źródło
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 ipop (): Służył do usuwania elementu, jeśli:
nieokreślony
pop()
=> od końca listyokreślony
pop(index)
=> indeksuOSTRZEŻ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.2.Usuń wartości z zakresu [indeks 1: indeks N]
del a[0:3]
=> wiele wartości w zakresie3.Ostatnia, ale nie lista, aby usunąć całą listę w jednym ujęciu
del (a)
=> jak powiedziano powyżej.Mam nadzieję, że to wyjaśni zamieszanie, jeśli w ogóle.
źródło
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
źródło
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)
Tutaj zobacz operacje:
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ń:
Zwroty [1,3,5,7]
rozważmy przypadek zbiorów.
źródło
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
źródło
delete
. Różnice polegają na tym, żepop
zwraca wartość idel
działa na plasterki. W przypadkach, w którychpop
działa,del
ma dokładnie taką samą złożoność obliczeniową (i jest nieco szybszy o stały składnik).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 .
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 .
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 .
Zobacz kolekcje.deque po więcej szczegółów.
źródło
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ę.
źródło
Możesz także użyć opcji usuń, aby usunąć wartość według indeksu.
n odnosi się wtedy do [1, 5]
źródło
n = [5, 3, 5]
więcn.remove(n[2])
.n.remove(n[2])
usuwan[0]
, a nien[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)