Jaka jest dict.get()
metoda
Jak już wspomniano, get
metoda zawiera dodatkowy parametr wskazujący brakującą wartość. Z dokumentacji
get(key[, default])
Zwróć wartość klucza, jeśli klucz znajduje się w słowniku, w przeciwnym razie wartość domyślna. Jeśli wartość domyślna nie jest podana, wartość domyślna to Brak, dzięki czemu ta metoda nigdy nie wywołuje wartości a KeyError
.
Przykładem może być
>>> d = {1:2,2:3}
>>> d[1]
2
>>> d.get(1)
2
>>> d.get(3)
>>> repr(d.get(3))
'None'
>>> d.get(3,1)
1
Czy są jakieś ulepszenia prędkości?
Jak wspomniano tutaj ,
Wydaje się, że wszystkie trzy podejścia wykazują teraz podobną wydajność (w odległości około 10% od siebie), mniej więcej niezależną od właściwości listy słów.
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)
def getway(d):
for i in range(100):
s = d.get(i)
def lookup(d):
for i in range(100):
s = d[i]
Teraz odmierzamy czas przy użyciu tych dwóch funkcji timeit
>>> import timeit
>>> print(timeit.timeit("getway({i:i for i in range(100)})","from __main__ import getway"))
20.2124660015
>>> print(timeit.timeit("lookup({i:i for i in range(100)})","from __main__ import lookup"))
16.16223979
Jak widzimy, wyszukiwanie jest szybsze niż pobieranie, ponieważ nie ma wyszukiwania funkcji. Można to zobaczyćdis
>>> def lookup(d,val):
... return d[val]
...
>>> def getway(d,val):
... return d.get(val)
...
>>> dis.dis(getway)
2 0 LOAD_FAST 0 (d)
3 LOAD_ATTR 0 (get)
6 LOAD_FAST 1 (val)
9 CALL_FUNCTION 1
12 RETURN_VALUE
>>> dis.dis(lookup)
2 0 LOAD_FAST 0 (d)
3 LOAD_FAST 1 (val)
6 BINARY_SUBSCR
7 RETURN_VALUE
Gdzie to się przyda?
Przyda się, gdy chcesz podać wartość domyślną, gdy szukasz słownika. To redukuje
if key in dic:
val = dic[key]
else:
val = def_val
Do jednej linii val = dic.get(key,def_val)
Gdzie to NIE będzie przydatne?
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!
Czy można mieć get
podobną funkcję dict['key']
?
Tak! Musimy wdrożyć__missing__
podklasę dict.
Przykładowy program może być
class MyDict(dict):
def __missing__(self, key):
return None
Może być mała demonstracja
>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'
dictionary["foo"]
idictionary.get("foo")
zachowują się jednak inaczej.