Python Cookbook-4.9 从字典中取值
任务
想从字典中取值,但是又不想由于你搜寻的键不存在而处理异常。
解决方案
字典的 get方法正是为取值而准备的。假设你有一个字典d={‘key’:value’,}。为了得到 key 在 d中对应的值,且不希望担心异常的问题,可以这样编写代码:
print(d.get('key','not found'))
如果想在取值之后将该条目删去,用d.pop(执行get和remove 操作)替换 d.get(只读取 d,从不修改d的值)即可。
讨论
为了在键不存在的时候取值且并不引发异常,用字典的简单的get方法即可。
如果试图通过索引的方式取值,比如d[x],而且x并不是字典d的键,你的举动会引发KeyError 异常。这通常也没什么问题。如果期望获取字典中x对应的值,异常是最好的提醒你所犯的错误的方式(比如,可能需要调试你的程序)。
然而,有时候只是想尝试一下,因为你已经知道,x可能不是d的键。这种情况下,不用引入in测试,如下:
if 'key'in d:
print d['key']
else:
print 'not found'
或者使用 try/except语句,如下:
try:
print d['key']
except KeyError:
print 'not found'
而应该使用 get 方法,就像“解决方案”所示的那样。如果调用 d.get(x),不会有任何异常抛出:如果x是字典d中的键,你会得到d[x],如果不是,你只能得到 None(可以检查或者继续传递)。当x不是d的键的时候,如果None不是你期望的值,还可以调用d.get(x,somethingelse)。这样,如果x不是d的键,得到的值是 somethingelse。
get 是一种简单而有用的机制,Python 的文档对此有很好的解释,奇怪的是有相当多的人并不清楚这一点。另一个类似的方法是 pop,与 get 很类似,只不过当键在字典中时,pop会同时删除该条目。还有一条附加说明:get和pop并不完全对应。如果x不是d的键,d.pop(x)会抛出 KeyError 异常;如果要想获得和 d.get(x)同样的效果,同时还具有删除条目的能力,调用d.pop(x,None)即可。