Potrzebuję sposobu, aby uzyskać wartość słownika, jeśli jego klucz istnieje, lub po prostu wrócić None
, jeśli nie istnieje.
Jednak Python zgłasza KeyError
wyjątek, jeśli szukasz klucza, który nie istnieje. Wiem, że mogę sprawdzić klucz, ale szukam czegoś bardziej wyraźnego. Czy istnieje sposób, aby po prostu wrócić, None
jeśli klucz nie istnieje?
python
dictionary
key
nonetype
Spyros
źródło
źródło
.get(key)
zamiast[key]
Odpowiedzi:
Możesz użyć
dict.get()
który zwróci
None
jeślikey is not in d
. Możesz także podać inną wartość domyślną, która zostanie zwrócona zamiastNone
:źródło
None
jeśli klucz zostanie wyraźnie zamapowanyNone
w nagraniu. Jeśli nie tego chcesz, możesz użyć czegoś takiegod.get(key) or "empty"
.[]
,""
,False
,0.0
lub rzeczywiścieNone
), to rozwiązanie będzie zawsze wrócić0
. Jeśli oczekujeszNone
s jako wartości, musisz to zrobićif key in d:
jawnie."empty"
jest zwracany, jeślikey
nie jest prawidłowym kluczemd
. Nie ma to nic wspólnego zkey
mapowaniem wartości .Nic dziwnego, że już nie. Jest wbudowany w język.
źródło
Posługiwać się
dict.get
Zwraca wartość klucza, jeśli klucz znajduje się w słowniku, w przeciwnym razie wartość domyślna. Jeśli wartość domyślna nie zostanie podana, domyślnie zostanie ustawiona wartość Brak, dzięki czemu ta metoda nigdy nie wywołuje błędu klucza.
źródło
Powinieneś użyć
get()
metody zdict
klasySpowoduje to
r == None
. Jeśli klucz nie zostanie znaleziony w słowniku, funkcja get zwraca drugi argument.źródło
None
jawnie. Jest to ustawienie domyślne.Jeśli potrzebujesz bardziej przejrzystego rozwiązania, możesz podklasę
dict
uzyskać w ten sposób:źródło
defaultdict
polega na tym, że będzie on wzrastał za każdym razem, gdy pojawi się element, którego jeszcze nie ma. Nie zawsze jest to pożądane.foo['bar']['test']['sss']
do powrotuNone
zamiast wyjątku Po jednej głębokości rozpocząć podającTypeError
zamiastKeyError
NoneDicts
. Pomogłoby to w przypadku,KeyError
gdyby zdarzyło się to w najbardziej wewnętrznym obiekcie. W przeciwnym razie problem polega na tym, że po zwróceniuNone
obiektu nie można go już subskrybować. Jeden brzydki hack polegałby na zwróceniu innego obiektu, który jest testowanyNone
. Uważaj jednak, że może to prowadzić do okropnych błędów.return dict.get(self, key)
nareturn super().get(key)
? Jeśli więc zdecyduję się na przykład użyć polecenia OrdersDict zamiast dykta, nie muszę się martwić o zmianę wielu wierszy kodu.Zwykle używam defaultdict w takich sytuacjach. Podajesz metodę fabryczną, która nie przyjmuje argumentów i tworzy wartość, gdy widzi nowy klucz. Jest to bardziej przydatne, gdy chcesz zwrócić coś w rodzaju pustej listy nowych kluczy ( patrz przykłady ).
źródło
defaultdict
polega na tym, że będzie się powiększał za każdym razem, gdy żądany będzie nieistniejący element.Możesz użyć metody
dict
obiektuget()
, jak już sugerowali inni. Alternatywnie, w zależności od tego, co dokładnie robisz, możesz użyć takiegotry/except
pakietu:Co jest uważane za bardzo „pytoniczne” podejście do obsługi sprawy.
źródło
Rozwiązaniem jedno-liniowym byłoby:
Jest to przydatne, gdy próbujesz dodać wartości słownika do nowej listy i chcesz podać wartość domyślną:
na przykład.
źródło
Jak powiedzieli inni powyżej, możesz użyć get ().
Ale aby sprawdzić klucz, możesz także:
źródło
get
metody.Byłem zaskoczony tym, co było możliwe w python2 vs python3. Odpowiem na to w oparciu o to, co skończyłem dla Python3. Mój cel był prosty: sprawdź, czy odpowiedź JSON w formacie słownika dała błąd, czy nie. Mój słownik nazywa się „tokenem”, a kluczem, którego szukam, jest „błąd”. Szukam klucza „błąd”, a jeśli go nie było, to ustawiam go na wartość Brak, wówczas sprawdzanie jest wartością Brak, jeśli tak, kontynuuj z moim kodem. Instrukcja else poradziłaby sobie, jeśli mam klucz „błąd”.
źródło
Jeśli możesz to zrobić
False
, to jest też wbudowana funkcja hasattr :źródło