今天,我遇到了dict方法get,它在字典中给定一个键,返回相关的值。
这个函数的用途是什么?如果我想在字典中找到一个与键相关的值,我可以只做dict[key],它返回相同的东西:
dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")
今天,我遇到了dict方法get,它在字典中给定一个键,返回相关的值。
这个函数的用途是什么?如果我想在字典中找到一个与键相关的值,我可以只做dict[key],它返回相同的东西:
dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")
当前回答
有一个区别,这可能是一个优势,如果我们正在寻找一个不存在的键,我们将得到None,不像我们使用括号符号时,在这种情况下,我们将得到一个错误抛出:
print(dictionary.get("address")) # None
print(dictionary["address"]) # throws KeyError: 'address'
get方法最后一个很酷的地方是,它接收了一个额外的可选参数作为默认值,也就是说,如果我们试图获取学生的分数值,但学生没有分数键,我们可以得到0。
所以与其这样做(或类似的事情):
score = None
try:
score = dictionary["score"]
except KeyError:
score = 0
我们可以这样做:
score = dictionary.get("score", 0)
# score = 0
其他回答
我将给出一个使用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条件
为什么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时处理异常
它允许您提供一个默认值,而不是在没有找到该值时得到一个错误。像这样的劝说代码:
class dictionary():
def get(self,key,default):
if self[key] is not found :
return default
else:
return self[key]
简短的回答
方括号用于条件查找,当缺少键时,条件查找可能会失败并返回KeyError。
get()方法用于无条件查找,这种查找永远不会失败,因为已经提供了默认值。
基本方法和辅助方法
方括号调用__getitem__方法,这是字典等映射的基础。
get()方法是在该功能之上分层的帮助器。它是通用编码模式的捷径:
try:
v = d[k]
except KeyError:
v = default_value
另一个我没有看到提到的用例是作为sort, max和min等函数的key参数。get方法允许根据它们的值返回键。
>>> ages = {"Harry": 17, "Lucy": 16, "Charlie": 18}
>>> print(sorted(ages, key=ages.get))
['Lucy', 'Harry', 'Charlie']
>>> print(max(ages, key=ages.get))
Charlie
>>> print(min(ages, key=ages.get))
Lucy
感谢对不同问题的回答提供了这个用例!