dict.get()
方法は何ですか?
すでに述べたように、get
メソッドには欠損値を示す追加のパラメーターが含まれています。ドキュメントから
get(key[, default])
keyが辞書にある場合はkeyの値を返し、そうでない場合はデフォルトです。defaultが指定されていない場合、デフォルトはNoneなので、このメソッドはを発生させませんKeyError
。
例は
>>> 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
速度の改善はどこにありますか?
ここで述べたように、
3つのアプローチすべてが、類似したパフォーマンスを示しているようです(互いに約10%以内)。これは、単語リストのプロパティとは無関係です。
以前get
はかなり低速でしたが、現在は速度がほぼ同等で、デフォルト値に戻るという追加の利点があります。しかし、すべてのクエリをクリアするために、かなり大きなリストでテストすることができます(テストにはすべての有効なキーのみの検索が含まれることに注意してください)
def getway(d):
for i in range(100):
s = d.get(i)
def lookup(d):
for i in range(100):
s = d[i]
次に、これら2つの関数のタイミングを 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
関数のルックアップがないため、ルックアップはgetよりも高速です。これは、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
それはどこで役に立ちますか?
辞書を検索しているときはいつでも、デフォルト値を提供したいときに役立ちます。これにより、
if key in dic:
val = dic[key]
else:
val = def_val
1行に val = dic.get(key,def_val)
役に立たない場所はどこですか?
KeyError
特定のキーが使用できないことを示すメッセージを返したい場合。デフォルト値を返すことには、特定のデフォルト値も重要になる可能性があるというリスクがあります。
のget
ような機能を持つことは可能dict['key']
ですか?
はい!__missing__
dictサブクラスでを実装する必要があります。
サンプルプログラムは
class MyDict(dict):
def __missing__(self, key):
return None
小さなデモは
>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'
dictionary["foo"]
dictionary.get("foo")
ただし、動作は異なります。