协慌网

登录 贡献 社区

为什么用 dict.get(key)而不是 dict [key]?

今天,我遇到了dict方法get ,在字典中给定键的情况下,该方法返回关联的值。

此功能用于什么目的?如果我想找到与字典中的键相关联的值,则可以执行dict[key] ,并且它返回相同的内容:

dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")

答案

如果缺少密钥,它可以让您提供默认值:

dictionary.get("bogus", default_value)

返回default_value (无论您选择的是什么),而

dictionary["bogus"]

会引发KeyError

如果省略,则default_valueNone ,这样

dictionary.get("bogus")  # <-- No default specified -- defaults to None

返回None就像

dictionary.get("bogus", None)

将。

什么是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

哪里有速度改进?

如前所述这里

似乎所有这三种方法现在都表现出相似的性能(彼此之间约占 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]

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

对于单行, val = dic.get(key,def_val)

在哪里没有用?

每当您想返回一个KeyError指出特定的键不可用时。返回默认值还带来了一个风险,即特定的默认值也可能是键!

是否有可能有get像功能dict['key']

是的!我们需要在 dict 子类中__missing__

一个示例程序可以是

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'

get需要第二个可选值。如果字典中不存在指定的键,则将返回此值。

dictionary = {"Name": "Harry", "Age": 17}
dictionary.get('Year', 'No available data')
>> 'No available data'

如果不提供第二个参数,则将返回None

如果像在dictionary['Year']那样使用索引,则不存在的键将引发KeyError