今天,我遇到了dict方法get,它在字典中给定一个键,返回相关的值。

这个函数的用途是什么?如果我想在字典中找到一个与键相关的值,我可以只做dict[key],它返回相同的东西:

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

当前回答

它允许您提供一个默认值,而不是在没有找到该值时得到一个错误。像这样的劝说代码:

class dictionary():
    def get(self,key,default):
         if self[key] is not found : 
               return default
         else:
               return self[key]

其他回答

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

0. 总结

与dict[键]相比,dict。Get在查找键时提供一个回退值。

1. 定义

Get (key[, default])内置类型- Python 3.6.4rc1文档

如果key在字典中,则返回key的值,否则为default。如果没有给出default,则默认为None,因此该方法永远不会引发KeyError。

d = {"Name": "Harry", "Age": 17}
In [4]: d['gender']
KeyError: 'gender'
In [5]: d.get('gender', 'Not specified, please add it')
Out[5]: 'Not specified, please add it'

2. 问题解决了。

如果没有默认值,则必须编写繁琐的代码来处理此类异常。

def get_harry_info(key):
    try:
        return "{}".format(d[key])
    except KeyError:
        return 'Not specified, please add it'
In [9]: get_harry_info('Name')
Out[9]: 'Harry'
In [10]: get_harry_info('Gender')
Out[10]: 'Not specified, please add it'

作为一个方便的解决方案,dict。Get引入了一个可选的默认值,避免了上述杂乱的代码。

3.结论

字典Get有一个额外的默认值选项,用于在字典中缺少key时处理异常

我将给出一个使用python抓取web数据的实际示例,很多时候你会得到没有值的键,在这种情况下,如果你使用dictionary['key'],你会得到错误。Get ('key', ' return_else ')没有问题。

类似地,如果您试图从列表中捕获单个值,我将使用“.join(list)”而不是列表[0]。

希望能有所帮助。

下面是一个实际的例子:

假设,您正在调用一个API,该API返回一个需要解析的JOSN文件。第一个JSON如下所示:

{"bids":{"id":16210506,"submitdate":"2011-10-16 15:53:25","submitdate_f":"10\/16\/2011 at 21:53 CEST","submitdate_f2":"p\u0159ed 2 lety","submitdate_ts":1318794805,"users_id":"2674360","project_id":"1250499"}}

第二个JOSN是这样的:

{"bids":{"id":16210506,"submitdate":"2011-10-16 15:53:25","submitdate_f":"10\/16\/2011 at 21:53 CEST","submitdate_f2":"p\u0159ed 2 lety","users_id":"2674360","project_id":"1250499"}}

请注意,第二个JSON缺少“submitdate_ts”键,这在任何数据结构中都是非常正常的。

因此,当你试图在循环中访问该键的值时,你可以用下面的方法调用它:

for item in API_call:
    submitdate_ts = item["bids"]["submitdate_ts"]

您可以这样做,但它会为第二个JSON行提供一个回溯错误,因为键根本不存在。

正确的编码方式如下:

for item in API_call:
    submitdate_ts = item.get("bids", {'x': None}).get("submitdate_ts")

{'x': None}的存在是为了避免第二级出错。当然,如果您正在进行抓取,您可以在代码中构建更多的容错性。比如首先指定一个if条件

这样做的目的是,如果没有找到键,您可以给出一个默认值,这非常有用

dictionary.get("Name",'harry')

这个函数的用途是什么?

一个特别的用法是用字典计数。让我们假设您想要计算给定列表中每个元素的出现次数。常见的方法是创建一个字典,其中键是元素,值是出现的次数。

fruits = ['apple', 'banana', 'peach', 'apple', 'pear']
d = {}
for fruit in fruits:
    if fruit not in d:
        d[fruit] = 0
    d[fruit] += 1

使用.get()方法,你可以使这段代码更紧凑和清晰:

for fruit in fruits:
    d[fruit] = d.get(fruit, 0) + 1

什么是dict.get()方法?

如前所述,get方法包含一个附加参数,用于指示缺少的值。来自文档

get(键(默认)) 如果key在字典中,则返回key的值,否则为default。如果没有给出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快,因为没有函数查找。这可以通过这个看出

>>> 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,说明特定的键不可用时。返回默认值也有风险,即特定的默认值也可能是键!

是否可能在dict['key']中有get like特征?

是的!我们需要在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'