Dzisiaj natknąłem się na dict
metodę, get
która po podaniu klucza w słowniku zwraca powiązaną wartość.
W jakim celu przydatna jest ta funkcja? Jeśli chciałbym znaleźć wartość powiązaną z kluczem w słowniku, mogę to zrobić dict[key]
i zwraca to samo:
dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")
python
dictionary
stensootla
źródło
źródło
dictionary["foo"]
idictionary.get("foo")
zachowują się jednak inaczej.dictionary.get("Age")
jest taki sam jak pisanie,dictionary["Age"] or None
więc domyślnie obsługuje wyjątek KeyErrordictionary['non-existent key'] or None
powinienem i nadal podnosiKeyError
dla mnie (do wersji 3.6). Czy możesz wyjaśnić, co masz na myśli?Odpowiedzi:
Pozwala podać wartość domyślną, jeśli brakuje klucza:
zwraca
default_value
(cokolwiek wybierzesz), podczas gdypodniósłby
KeyError
.Jeśli pominięto,
default_value
oznacza toNone
, żezwraca
None
tak jakby.
źródło
dictionary.get("bogus") or my_default
? Widziałem ludzi, którzy używają go w niektórych przypadkach i zastanawiałem się, czy jest jakaś korzyść z używania jednego zamiast drugiego (innego niż czytelność)"bogus"
jest kluczemdictionary
idictionary.get("bogus")
zwraca wartość, która zwraca wartość False w kontekście boolowskim (tj. Wartość Falsey), taką jak 0 lub pusty ciąg''
, wówczasdictionary.get("bogus") or my_default
ocenia na,my_default
podczas gdydictionary.get("bogus", my_default)
zwraca wartość Falsey. Więc nie,dictionary.get("bogus") or my_default
nie jest równoważne zdictionary.get("bogus", my_default)
. Które stosować zależy od pożądanego zachowania.x = {'a':0}
. Potemx.get('a', 'foo')
wraca,0
alex.get('a') or 'foo'
wraca'foo'
.dictionary.get('key')
: Może być mylące, jeśli wartości w słowniku sąNone
. Bez podania wartości zwracanej (drugi opcjonalny argument) nie ma sposobu, aby sprawdzić, czy klucz nie istnieje lub czy jego wartość toNone
. W tym konkretnym przypadku rozważyłbym użycietry-except-KeyError
.Jak już wspomniano,
get
metoda zawiera dodatkowy parametr wskazujący brakującą wartość. Z dokumentacjiPrzykładem może być
Jak wspomniano tutaj ,
Wcześniej
get
było znacznie wolniejsze, ale teraz prędkość jest prawie porównywalna wraz z dodatkową zaletą zwracania wartości domyślnej. Ale aby wyczyścić wszystkie nasze zapytania, możemy przetestować na dość dużej liście (pamiętaj, że test obejmuje sprawdzenie tylko wszystkich prawidłowych kluczy)Teraz odmierzamy czas przy użyciu tych dwóch funkcji
timeit
Jak widzimy, wyszukiwanie jest szybsze niż pobieranie, ponieważ nie ma wyszukiwania funkcji. Można to zobaczyć
dis
Przyda się, gdy chcesz podać wartość domyślną, gdy szukasz słownika. To redukuje
Do jednej linii
val = dic.get(key,def_val)
Ilekroć chcesz zwrócić informację
KeyError
, że dany klucz nie jest dostępny. Zwrócenie wartości domyślnej niesie również ryzyko, że określona wartość domyślna może być kluczem!Tak! Musimy wdrożyć
__missing__
podklasę dict.Przykładowy program może być
Może być mała demonstracja
źródło
if k in dict and dict[k]:
vsif dict.get(k):
. Dotyczy to sytuacji, gdy musimy sprawdzić, czy klucz istnieje, a jeśli „tak” - jaką wartość ?, coś takiego:dict = {1: '', 2: 'some value'}
.dictionary.get(value, long_function())
rozważać użyciedictionary.get(value) or long_function()
get
przyjmuje drugą opcjonalną wartość. Jeśli określony klucz nie istnieje w słowniku, ta wartość zostanie zwrócona.Jeśli nie podasz drugiego parametru,
None
zostanie zwrócony.Jeśli użyjesz indeksowania jak w
dictionary['Year']
, nieistniejące klucze wzrosnąKeyError
.źródło
Podam praktyczny przykład skrobania danych internetowych przy użyciu Pythona, często dostajesz klucze bez wartości, w takich przypadkach będziesz otrzymywać błędy, jeśli użyjesz słownika ['klucz'], podczas gdy dictionary.get ('klucz „,” return_otherwise ”) nie ma problemów.
Podobnie użyłbym '' .join (lista) w przeciwieństwie do listy [0], jeśli spróbujesz przechwycić pojedynczą wartość z listy.
mam nadzieję, że to pomoże.
[Edytuj] Oto praktyczny przykład:
Załóżmy, że wywołujesz interfejs API, który zwraca plik JOSN, który musisz przeanalizować. Pierwszy JSON wygląda następująco:
Drugi JOSN wygląda tak:
Zauważ, że w drugim JSON brakuje klucza „submdate_ts”, co jest dość normalne w każdej strukturze danych.
Więc kiedy próbujesz uzyskać dostęp do wartości tego klucza w pętli, możesz wywołać go w następujący sposób:
Możesz, ale spowoduje to błąd śledzenia dla drugiej linii JSON, ponieważ klucz po prostu nie istnieje.
Odpowiednim sposobem zakodowania tego może być:
{'x': Brak} ma na celu uniknięcie błędu drugiego poziomu. Oczywiście, jeśli robisz skrobanie, możesz wbudować w kod większą tolerancję na błędy. Jak pierwsze określenie warunku if
źródło
Celem jest podanie wartości domyślnej, jeśli klucz nie zostanie znaleziony, co jest bardzo przydatne
źródło
Jednym szczególnym zastosowaniem jest liczenie ze słownikiem. Załóżmy, że chcesz policzyć liczbę wystąpień każdego elementu na danej liście. Częstym sposobem jest utworzenie słownika, w którym klucze są elementami, a wartości są liczbą wystąpień.
Za pomocą tej
.get()
metody możesz uczynić ten kod bardziej zwartym i przejrzystym:źródło
Musisz wiedzieć, kiedy używasz
.get()
:Jeśli słownik zawiera klucz użyty w wywołaniu,
.get()
a jego wartość toNone
,.get()
metoda zwróci,None
nawet jeśli zostanie podana wartość domyślna.Na przykład następujące zwroty
None
nie'alt_value'
są zgodne z oczekiwaniami:.get()
Druga wartość jest zwracana tylko wtedy, gdy dostarczony klucz NIE znajduje się w słowniku, a nie, jeśli zwracana jest wartość tego wywołaniaNone
.źródło
d.get('key') or 'alt_value'
jeśli wiesz, że to może byćNone
0. Podsumowanie
W porównaniu do
dict[key]
,dict.get
zapewnia rezerwową wartość przy wyszukiwaniu klucza.1. Definicja
get (klucz [, domyślnie]) 4. Typy wbudowane - dokumentacja Python 3.6.4rc1
Zwróć 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.
2. Problem rozwiązuje.
Jeśli nie
default value
, musisz napisać kłopotliwe kody, aby obsłużyć taki wyjątek.Jako wygodne rozwiązanie
dict.get
wprowadza opcjonalną wartość domyślną, unikając nieporadnych kodów.3. Wniosek
dict.get
ma dodatkową opcję wartości domyślnej, aby poradzić sobie z wyjątkiem, jeśli nie ma klucza w słownikuźródło
Jedną różnicą, która może być zaletą, jest to, że jeśli szukamy klucza, który nie istnieje, otrzymamy Brak, nie tak jak w przypadku notacji w nawiasach, w którym to przypadku zostanie zgłoszony błąd:
Ostatnią rzeczą, która jest fajna w metodzie get, jest to, że otrzymuje ona dodatkowy opcjonalny argument za wartością domyślną, to znaczy, jeśli próbujemy uzyskać wartość punktową ucznia, ale uczeń nie ma klucza oceny, który możemy uzyskać zamiast tego 0.
Zamiast robić to (lub coś podobnego):
Możemy to zrobić:
źródło
W zależności od użycia należy użyć tej
get
metody.Przykład 1
Przykład 2
źródło