a = [1, 2, 3, 4]
b = a.index(6)
del a[b]
print(a)
Powyżej pokazuje następujący błąd:
Traceback (most recent call last):
File "D:\zjm_code\a.py", line 6, in <module>
b = a.index(6)
ValueError: list.index(x): x not in list
Więc muszę to zrobić:
a = [1, 2, 3, 4]
try:
b = a.index(6)
del a[b]
except:
pass
print(a)
Ale czy nie ma prostszego sposobu na zrobienie tego?
except
to zła praktyka . Używajexcept Exception
co najmniej.Odpowiedzi:
Aby usunąć pierwsze wystąpienie elementu z listy, po prostu użyj
list.remove
:Pamiętaj, że nie usuwa wszystkich wystąpień twojego elementu. Użyj do tego zrozumienia listy.
źródło
remove
że O (n)?Zwykle Python zgłasza wyjątek, jeśli powiesz mu, aby zrobił coś, czego nie może, więc będziesz musiał zrobić albo:
lub:
Wyjątek niekoniecznie musi być złą rzeczą, o ile oczekuje się tego i odpowiednio się z nim obchodzi.
źródło
a.remove(c)
mimo to może się nie powieść pomimoif c in a
sprawdzenia (a
może zostać zmodyfikowany w innym wątku poc in a
sprawdzeniu, ale przeda.remove(c)
wywołaniem).try/except
lub można zastosować zamki, aby uniknąć wyścigu.Możesz to zrobić
ale powyżej trzeba przeszukać 2 na liście 2 razy, więc spróbuj z wyjątkiem, że byłoby szybsze
źródło
Rozważać:
Aby usunąć wszystkie wystąpienia, możesz użyć funkcji filtrowania w Pythonie. Na przykład wyglądałoby to tak:
Zachowałoby to wszystkie elementy
a != 2
.Aby wyjąć jeden z przedmiotów, użyj
źródło
filter()
w innylist()
? Zgodnie z instrukcją zwraca już listę.Oto jak to zrobić w miejscu (bez zrozumienia listy):
źródło
O(n*n)
niepotrzebna (porównaj 1e6 i 1e12 - nie chcesz ryzykować tego drugiego).while 1: L.remove(value)
i powrótValueError
może działać dobrze z kilkomavalue
s lub małymi listami w CPython.Jeśli wiesz, jaką wartość usunąć, oto prosty sposób (w każdym razie tak prosty, jak tylko mogę sobie wyobrazić):
Dostaniesz
[0, 0, 2, 3, 4]
źródło
while 1 in a:
jako struktury pętli?O(n^2)
tam byłoby zrozumienieO(n)
.Inną możliwością jest użycie zestawu zamiast listy, jeśli zestaw ma zastosowanie w Twojej aplikacji.
IE, jeśli twoje dane nie są uporządkowane i nie mają duplikatów, to
jest wolny od błędów.
Często lista jest po prostu poręcznym pojemnikiem na przedmioty, które są faktycznie nieuporządkowane. Pojawiają się pytania dotyczące usuwania wszystkich wystąpień elementu z listy. Jeśli nie chcesz dupków, po raz kolejny przydatny jest zestaw.
nie zmienia my_set z góry.
źródło
Jak stwierdzono w wielu innych odpowiedziach,
list.remove()
zadziała, ale rzuć a,ValueError
jeśli pozycji nie było na liście. W Pythonie 3.4+ istnieje ciekawe podejście do radzenia sobie z tym przy użyciu menedżera kontekstu pomijania :źródło
Znalezienie wartości na liście, a następnie usunięcie tego indeksu (jeśli istnieje) jest łatwiejsze dzięki użyciu metody usuwania listy:
Jeśli robisz to często, możesz zawinąć to w funkcję:
źródło
Ten przykład jest szybki i usunie wszystkie wystąpienia wartości z listy:
źródło
break
onexcept ValueError
.W jednej linii:
czasami jest to przydatne.
Jeszcze łatwiej:
źródło
Jeśli twoje elementy są wyraźne, wystarczy prosta różnica w zestawie.
źródło
Możemy również użyć .pop:
źródło
Zastąp listę, indeksując wszystko oprócz elementów, które chcesz usunąć
źródło
Z pętlą for i warunkiem:
A jeśli chcesz usunąć niektóre, ale nie wszystkie:
źródło
źródło
Powiedzmy na przykład, że chcemy usunąć wszystkie 1 z x. Tak bym to zrobił:
To praktyczne zastosowanie mojej metody:
A to moja metoda w jednym wierszu:
Oba dają to jako wynik:
Mam nadzieję że to pomoże. PS, proszę zauważyć, że zostało to napisane w wersji 3.6.2, więc może być konieczne dostosowanie go do starszych wersji.
źródło
Być może twoje rozwiązania działają z ints, ale nie działa dla mnie ze słownikami.
Z jednej strony remove () nie działało dla mnie. Ale może działa z podstawowymi typami. Sądzę, że poniższy kod to także sposób na usunięcie elementów z listy obiektów.
Z drugiej strony „del” również nie działało poprawnie. W moim przypadku, używając Pythona 3.6: kiedy próbuję usunąć element z listy w poleceniu „for” bucle za pomocą polecenia „del”, python zmienia indeks procesu i jądro zatrzymuje się przedwcześnie. Działa tylko wtedy, gdy usuniesz element po elemencie w odwrotnej kolejności. W ten sposób nie zmieniasz indeksu tablicy oczekujących elementów podczas jego przeglądania
Następnie użyłem:
gdzie „lista” jest jak [{'klucz1': wartość1 '}, {' klucz2 ': wartość2}, {' klucz3 ': wartość3}, ...]
Możesz także zrobić więcej Pythona za pomocą wyliczenia:
źródło
źródło
To usuwa wszystkie wystąpienia
"-v"
z tablicysys.argv
i nie narzeka, jeśli nie znaleziono żadnych wystąpień:Możesz zobaczyć kod w akcji w pliku o nazwie
speechToText.py
:źródło
to moja odpowiedź, po prostu użyj na czas i dla
źródło