Jak usunąć element z listy według indeksu w Pythonie?
Znalazłem list.remove
metodę, ale powiedz, że chcę usunąć ostatni element, jak to zrobić? Wygląda na to, że domyślne usunięcie powoduje przeszukanie listy, ale nie chcę, aby wyszukiwanie było wykonywane.
O(n)
w czasie.deque()
zapewnia wydajne operacje na obu końcach, ale nie zapewnia wstawiania / wyszukiwania / usuwania O (1) w środku.O(n)
dostępu do indeksua[i]
(z powodu list połączonych). Uwaga: implementacja tablicowa zapewniaO(1)
dostęp do indeksu.Odpowiedzi:
Użyj
del
i określ indeks elementu, który chcesz usunąć:Obsługuje również plastry:
Oto sekcja z samouczka.
źródło
PyList_GetItem()
zasadniczo zwraca((PyListObject *)op) -> ob_item[i];
-i
th element tablicy.Prawdopodobnie chcesz
pop
:Domyślnie
pop
bez żadnych argumentów usuwa ostatni element:źródło
pop()
sama w sobie jest bardzo oczywista, choćpop(-1)
potencjalnie myląca właśnie dlatego, że jest redundantna.pop
w większości języków programowania zwykle usuwa ostatni element, podobnie jak w Pythonie. Więc czy podasz -1 czy nic nie będzie takie samo.pop()
zwraca każdy usunięty element.Podobnie jak inni wspomniano pop i del są to skuteczne sposoby, aby usunąć element o danym indeksie. Jednak tylko ze względu na ukończenie (ponieważ to samo można zrobić na wiele sposobów w Pythonie):
Używanie plasterków (nie powoduje to usunięcia elementu z oryginalnej listy):
(Również będzie to najmniej wydajna metoda podczas pracy z listą Python, ale może to być przydatne (ale nie wydajne, powtarzam) podczas pracy z obiektami zdefiniowanymi przez użytkownika, które nie obsługują pop, ale definiują a
__getitem__
):Uwaga: należy pamiętać, że ta metoda nie modyfikuje listy w miejscu jak
pop
idel
. Zamiast tego tworzy dwie kopie list (jedną od początku do indeksu, ale bez niego (a[:index]
), a drugą po indeksie do ostatniego elementu (a[index+1:]
)) i tworzy nowy obiekt listy, dodając oba. Jest to następnie przypisywane do zmiennej listy (a
). Stary obiekt listy jest zatem wyrejestrowany, a zatem zbierany w pamięci (pod warunkiem, że do oryginalnego obiektu listy nie odwołuje się żadna zmienna inna niż a).To sprawia, że ta metoda jest bardzo nieefektywna i może również powodować niepożądane skutki uboczne (szczególnie, gdy inne zmienne wskazują oryginalny obiekt listy, który pozostaje niezmodyfikowany).
Dzięki @MarkDickinson za zwrócenie uwagi na to ...
Ta odpowiedź na przepełnienie stosu wyjaśnia pojęcie krojenia.
Zauważ też, że działa to tylko z dodatnimi indeksami.
Podczas używania z obiektami
__getitem__
metoda musi zostać zdefiniowana, a co ważniejsze,__add__
metoda musi zostać zdefiniowana, aby zwrócić obiekt zawierający elementy z obu argumentów operacji.Zasadniczo działa to z każdym obiektem, którego definicja klasy przypomina:
Działa to przy użyciu
list
definicji__getitem__
i__add__
metod.Porównanie trzech sposobów pod względem wydajności:
Załóżmy, że wstępnie zdefiniowano następujące elementy:
del object[index]
Metoda:Zdecydowanie najbardziej wydajna metoda. Działa to ze wszystkimi obiektami, które definiują
__del__
metodę.Demontaż wygląda następująco:
Kod:
Demontaż:
pop
metoda:Jest mniej wydajny niż metoda del i jest używany, gdy trzeba uzyskać usunięty element.
Kod:
Demontaż:
Metoda wycinania i dodawania.
Najmniej wydajny.
Kod:
Demontaż:
Uwaga: We wszystkich trzech demontażach zignoruj dwie ostatnie linie, które w zasadzie są
return None
. Również pierwsze dwa wiersze ładują wartości globalnea
iindex
.źródło
a = a[:index] + a[index+1 :]
-trick był najbezpieczniejszy, jeśli chodzi o ogromne listy. Wszystkie inne metody zakończyły się impasem. Dziękuję bardzopop
jest również przydatny do usuwania i przechowywania elementu z listy. Gdziedel
faktycznie niszczy przedmiot.źródło
Jeśli chcesz usunąć określony element pozycji z listy, np. 2, 3 i 7. nie możesz użyć
Ponieważ po usunięciu drugiego elementu trzeci usuwany element faktycznie jest czwartym elementem na oryginalnej liście. Możesz odfiltrować 2, 3 i 7 element na oryginalnej liście i uzyskać nową listę, jak poniżej:
źródło
To zależy od tego, co chcesz zrobić.
Jeśli chcesz zwrócić usunięty element, użyj
pop()
:Jeśli jednak chcesz tylko usunąć element, użyj
del
:Dodatkowo
del
pozwala na korzystanie z plasterków (npdel[2:]
.).źródło
Ogólnie używam następującej metody:
źródło
Jeszcze inny sposób usunięcia elementu (ów) z listy według indeksu.
[x: y] wskazuje elementy od indeksu
x
doy-1
. Gdy deklarujemy tę część listy jako pustą listę ([]
), elementy te są usuwane.źródło
Możesz po prostu wyszukać element, który chcesz usunąć. To jest naprawdę proste. Przykład:
Wyjście: acde
źródło
Użyj następującego kodu, aby usunąć element z listy:
Jeśli chcesz usunąć dane elementu indeksu z listy, użyj:
źródło
Jak wspomniano wcześniej, najlepszą praktyką jest del (); lub pop (), jeśli chcesz znać wartość.
Alternatywnym rozwiązaniem jest układanie w stos tylko tych elementów, które chcesz:
eta: hmm ... nie będzie działać na ujemne wartości indeksu, zastanowi się i zaktualizuje
Przypuszczam
załatałoby to ... ale nagle ten pomysł wydaje się bardzo kruchy. Ciekawy eksperyment myślowy. Wydaje się, że powinien istnieć „właściwy” sposób na wykonanie tego za pomocą funkcji append () / list.
zastanawianie się
źródło
del()
? Dla tej funkcji podajesz listę jako pierwszy argument tej funkcji, a następnie indeks, czy najpierw indeks, a potem listę? Czy zwraca argument listy bez elementu, czy usuwa na miejscu? Wiem odel
instrukcji, ale nie o funkcji o tej samej nazwie.Nie brzmi to tak, jakbyś pracował z listą listów, więc powiem krótko. Chcesz użyć pop, ponieważ usunie to elementy, a nie elementy, które są listami, powinieneś do tego użyć del. Aby wywołać ostatni element w pythonie, jest to „-1”
źródło
pop()
idel
oba usuwają element z podanego indeksu, niezależnie od tego, czy ten element sam jest listą, czy nie.a = [1, [2, 3], 4]; del a[1]; b = [1, [2, 3], 4]; b.pop(1); assert a == b
l - lista wartości; musimy usunąć indeksy z listy inds2rem .
źródło
<map at 0x7f4d54109a58>
. a l to zakres (0,20)Użyj funkcji „del” :
Na przykład, jeśli chcesz usunąć ostatnie 3 elementy, kod powinien wyglądać następująco:
Na przykład, jeśli chcesz usunąć ostatnie 8 elementów, kod powinien mieć:
źródło
del
jest stwierdzeniem . Gdyby to była funkcja, musiałbyś napisaćdel(listame[-N])
Zostało już wspomniane, jak usunąć pojedynczy element z listy i jakie zalety mają różne metody. Pamiętaj jednak, że usunięcie wielu elementów może powodować błędy:
Elementy 3 i 8 (nie 3 i 7) z oryginalnej listy zostały usunięte (ponieważ lista została skrócona podczas pętli), co mogło nie być zamierzone. Jeśli chcesz bezpiecznie usunąć wiele indeksów, powinieneś najpierw usunąć elementy o najwyższym indeksie, np. Tak:
źródło
Lub jeśli należy usunąć wiele indeksów:
Oczywiście wtedy można również zrobić:
źródło
Możesz użyć del lub pop, aby usunąć element z listy na podstawie indeksu. Pop wydrukuje członka, który usuwa z listy, a lista usunie tego członka bez drukowania.
źródło
Można użyć del lub pop, ale wolę del, ponieważ możesz określić indeks i plasterki, dając użytkownikowi większą kontrolę nad danymi.
Na przykład, zaczynając od pokazanej listy, można usunąć ostatni element za pomocą
del
jako plasterek, a następnie można usunąć ostatni element z wyniku za pomocąpop
.źródło