Jaka jest dict.get()metoda
Jak już wspomniano, getmetoda 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 getbył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ć getpodobną 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.