为什么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_value
是None
,例如
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