Jaki jest najlepszy sposób usunięcia pozycji ze słownika według wartości, tj. Gdy klucz pozycji jest nieznany? Oto proste podejście:
for key, item in some_dict.items():
if item is item_to_remove:
del some_dict[key]
Czy są lepsze sposoby? Czy jest coś złego w mutowaniu (usuwaniu elementów) ze słownika podczas iteracji?
python
dictionary
Przyciski840
źródło
źródło
Odpowiedzi:
Należy pamiętać, że aktualnie testujesz tożsamość obiektu (
is
zwraca tylkoTrue
wtedy, gdy oba operandy są reprezentowane przez ten sam obiekt w pamięci - nie zawsze tak jest w przypadku dwóch obiektów, które porównują równe z==
). Jeśli robisz to celowo, możesz przepisać swój kod jakoAle to może nie zrobić tego, co chcesz:
Więc prawdopodobnie chcesz
!=
zamiastis not
.źródło
some_dict.iteritems()
tutaj i umieścićfor
iif
oświadczenia w oddzielnych wierszach dla czytelnościiteritems
terazitems
. W Pythonie 2.7iteritems()
jest rzeczywiście lepszy.dict()
odpowiednim wyrażeniem generatora, czyli 2.4. meta: może przeglądać peps tutaj, aby znaleźć rzeczy.dict.pop(key[, default])
Metoda pozwala na usuwanie elementów, gdy wiesz klucz. Zwraca wartość z klucza, jeśli usuwa element, w przeciwnym razie zwraca wartość przekazaną jakodefault
. Zobacz dokumentację .Przykład:
źródło
źródło
Proste porównanie między del i pop () :
wynik:
Tak więc del jest szybsze niż pop () .
źródło
pop()
(jak w przypadku @ n-1-1 powyżej) - co nie jest opcją dladel
operatora.timeit
. Dziękuję za ten jasny przykład.items()
zwraca listę i to jest ta lista, którą iterujesz, więc mutowanie dyktowania w pętli nie ma tutaj znaczenia. Gdybyśiteritems()
zamiast tego używał , mutowanie dyktowania w pętli byłoby problematyczne , podobnie jakviewitems()
w Pythonie 2.7.Nie mogę wymyślić lepszego sposobu na usuwanie pozycji z dyktu według wartości.
źródło
Zbudowałbym listę kluczy, które trzeba usunąć, a następnie je usunąłem. Jest to proste, wydajne i pozwala uniknąć problemów związanych z jednoczesnym iterowaniem i mutowaniem dyktowania.
źródło
c to nowy słownik, a a to Twój oryginalny słownik, {'z', 'w'} to klucze, które chcesz usunąć z
Sprawdź również: https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch01.html
źródło
źródło
Nie ma nic złego w usuwaniu elementów ze słownika podczas iteracji, jak zaproponowałeś. Uważaj na wiele wątków używających tego samego słownika w tym samym czasie, co może spowodować błąd KeyError lub inne problemy.
Oczywiście zapoznaj się z dokumentacją pod adresem http://docs.python.org/library/stdtypes.html#typesmapping
źródło
for k,v in d.iteritems(): del d[k]
dałobyRuntimeError: dictionary changed size during iteration
. Zobacz wyjaśnienie mithrandi.Tak bym to zrobił.
źródło