为什么dict.get(键)而不是字典?

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

这个function有什么用处? 如果我想在字典中find一个与键相关的值,我可以做dict[key] ,并返回相同的结果:

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

它允许你提供一个默认值,如果缺less密钥:

 dictionary.get("bogus", default_value) 

返回default_value (无论你select它),而

 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]) 

如果键在字典中,则返回键的值,否则返回默认值。 如果没有给出默认值,它默认为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 

有速度改善吗?

如上所述,

现在看来,所有这三种方法现在都performance出类似的performance(彼此差不多在10%以内),或多或less独立于单词列表的属性。

早些时候get的速度相当慢,但是现在速度几乎是可比的,还有返回默认值的额外优势。 但是要清除我们所有的查询,我们可以在一个相当大的列表上进行testing(注意,testing只包括查找所有有效的键)

 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 

哪里有用?

每当你想要提供一个默认值,每当你正在查找一本字典时,它将会很有用。 这减less了

  if key in dic: val = key[dic] else: val = def_val 

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

哪里没用?

每当你想返回一个KeyError说明特定的键不可用。 返回默认值也带有一个特定的默认值也可能是一个关键的风险!

是否有可能在dict['key'] get类似function?

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

目的是,如果找不到密钥,可以给出默认值,这是非常有用的

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

我将举一个实际的例子来说明如何使用python抓取网页数据,很多时候你会得到没有值的键值,在这种情况下,如果你使用dictionary ['key'],你会得到错误,而dictionary.get('key ','return_otherwise')没有问题。

同样,如果您尝试从列表中捕获单个值,我将使用“'.join(list)而不是list [0]。

希望能帮助到你。

[编辑]这里是一个实际的例子:

比方说,你正在调用一个API,它返回一个你需要parsing的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缺less“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':无}是为了避免第二个级别出现错误。 当然,如果您正在进行刮擦,您可以在代码中增加更多的容错function。 像首先指定一个if条件

根据使用情况应该使用这个get方法。

例1

 In [14]: user_dict = {'type': False} In [15]: user_dict.get('type', '') Out[15]: False In [16]: user_dict.get('type') or '' Out[16]: '' 

例题

 In [17]: user_dict = {'type': "lead"} In [18]: user_dict.get('type') or '' Out[18]: 'lead' In [19]: user_dict.get('type', '') Out[19]: 'lead' 

这个function有什么用处?

一个特定的用法是用字典计算。 假设您想要计算给定列表中每个元素的出现次数。 这样做的常用方法是创build一个字典,其中键是元素,值是发生次数。

 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