在读取dictkeyvalue时,如果key不存在,就会触发KeyError错误,如:

Python
t = {
'a': '',
'b': '',
'c': '',
}
print(t['d'])

就会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">KeyError: 'd'
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

第一种解决方法

首先测试key是否存在,然后才进行下一步操作,如:

t = {
'a': '',
'b': '',
'c': '',
}
if 'd' in t:
print(t['d'])
else:
print('not exist')

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">not exist
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

第二种解决方法

利用dict内置的get(key[,default])方法,如果key存在,则返回其value,否则返回default;使用这个方法永远不会触发KeyError,如:

t = {
'a': '',
'b': '',
'c': '',
}
print(t.get('d'))

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">None
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

加上default参数:

t = {
'a': '',
'b': '',
'c': '',
}
print(t.get('d', 'not exist'))
print(t)

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">not exist
{'a': '1', 'c': '3', 'b': '2'}
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span><span style="display:block;"></span></span></code>

第三种解决方法

利用dict内置的setdefault(key[,default])方法,如果key存在,则返回其value;否则插入此key,其valuedefault,并返回default;使用这个方法也永远不会触发KeyError,如:

t = {
'a': '',
'b': '',
'c': '',
}
print(t.setdefault('d'))
print(t)

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">None
{'b': '2', 'd': None, 'a': '1', 'c': '3'}
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span><span style="display:block;"></span></span></code>

加上default参数:

t = {
'a': '',
'b': '',
'c': '',
}
print(t.setdefault('d', 'not exist'))
print(t)

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">not exist
{'c': '3', 'd': 'not exist', 'a': '1', 'b': '2'}
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span><span style="display:block;"></span></span></code>

第四种解决方法

向类dict增加__missing__()方法,当key不存在时,会转向__missing__()方法处理,而不触发KeyError,如:

t = {
'a': '',
'b': '',
'c': '',
} class Counter(dict): def __missing__(self, key):
return None
c = Counter(t)
print(c['d'])

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">None
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

更改return值:

t = {
'a': '',
'b': '',
'c': '',
} class Counter(dict): def __missing__(self, key):
return key
c = Counter(t)
print(c['d'])
print(c)

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">d
{'c': '3', 'a': '1', 'b': '2'}
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span><span style="display:block;"></span></span></code>

第五种解决方法

利用collections.defaultdict([default_factory[,...]])对象,实际上这个是继承自dict,而且实际也是用到的__missing__()方法,其default_factory参数就是向__missing__()方法传递的,不过使用起来更加顺手:
如果default_factoryNone,则与dict无区别,会触发KeyError错误,如:

import collections
t = {
'a': '',
'b': '',
'c': '',
}
t = collections.defaultdict(None, t)
print(t['d'])

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">KeyError: 'd'
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

但如果真的想返回None也不是没有办法:

import collections
t = {
'a': '',
'b': '',
'c': '',
} def handle():
return None
t = collections.defaultdict(handle, t)
print(t['d'])

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">None
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

如果default_factory参数是某种数据类型,则会返回其默认值,如:

import collections
t = {
'a': '',
'b': '',
'c': '',
}
t = collections.defaultdict(int, t)
print(t['d'])

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">0
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

又如:

import collections
t = {
'a': '',
'b': '',
'c': '',
}
t = collections.defaultdict(list, t)
print(t['d'])

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">[]
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

注意:
如果dict内又含有dictkey嵌套获取value时,如果中间某个key不存在,则上述方法均失效,一定会触发KeyError

import collections
t = {
'a': '',
'b': '',
'c': '',
}
t = collections.defaultdict(dict, t)
print(t['d']['y'])

实际操作:

for rb in data:
rb.setdefault('telephone') #当没有telephone时,设置为None

以上内容参考:https://blog.csdn.net/chenbindsg/article/details/73864045

操作dict时避免出现KeyError的几种方法的更多相关文章

  1. Python操作dict时避免出现KeyError的几种方法

    见原文:https://www.polarxiong.com/archives/Python-%E6%93%8D%E4%BD%9Cdict%E6%97%B6%E9%81%BF%E5%85%8D%E5% ...

  2. Apache shiro集群实现 (八) web集群时session同步的3种方法

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  3. 【转】web集群时session同步的3种方法

    转载请注明作者:海底苍鹰地址:http://blog.51yip.com/server/922.html 在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问 ...

  4. web集群时session同步的3种方法[转]

    在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是 ...

  5. web集群时session同步的3种方法

    在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是 ...

  6. C# 给PDF签名时添加时间戳的2种方法(附VB.NET代码)

    在PDF添加签名时,支持添加可信时间戳来保证文档的法律效应.本文,将通过C#程序代码介绍如何添加可信时间戳,可通过2种方法来实现.文中附上VB.NET代码,有需可供参考. 一.程序运行环境 编译环境: ...

  7. 通过EF操作Sqlite时遇到的问题及解决方法

    1.使用Guid作为字段类型时,能存,能查,但是作为查询条件时查询不到数据 解决方法:连接字符串加上;binaryguid=False

  8. asp.net操作GridView添删改查的两种方法 及 光棒效果

    这部份小内容很想写下来了,因为是基础中的基础,但是近来用的比较少,又温习了一篇,发现有点陌生了,所以,还是写一下吧. 方法一:使用Gridview本身自带的事件处理,代码如下(注意:每次操作完都得重新 ...

  9. 一、winForm-DataGridView操作——控件绑定事件的两种方法

    在winForm窗体中绑定(注册)事件的方法有两种: 一.绑定事件 双击控件,即进入.cs的代码编辑页面,会出现 类似于“ private void 控件名称_Click(object sender, ...

随机推荐

  1. table 中的tr 行点击 变换颜色背景

    <style> table{border-collapse: collapse;border-spacing: 0; width: 100%;} table tr th,td{border ...

  2. SqlServer常用语句

    首先,写这个的原因是我其实sql语句不太行,总觉得自己写得很乱,好像也没有系统学习过,借此复习和与大家探讨 No.1 关于查询时间区间是否重叠的sql语句 问题是这样:插入之前,想查询同User是否其 ...

  3. [javaSE] IO流(递归查找指定文件)

    递归方法,实现查找目录中以.java为后缀的文件路径,并存入文本文件中 定义一个静态方法fileToLine(),传入参数:File对象目录,List集合对象(List<File> 这样做 ...

  4. JDBC数据库连接池

    用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库 ...

  5. 分布式时序数据库InfluxDB

    我们内部的监控系统用到分布式时序数据库InfluxDB http://www.ttlsa.com/monitor-safe/monitor/distributed-time-series-databa ...

  6. Luogu4191:[CTSC2010]性能优化

    传送门 题目翻译:给定两个 \(n\) 次多项式 \(A,B\) 和一个整数 \(C\),求 \(A\times B^C\) 在模 \(x^n\) 意义下的卷积 显然就是个循环卷积,所以只要代入 \( ...

  7. N次剩余和二次剩余

    N次剩余 给定 \(N,a,P\),且 \(P\) 最好为质数 可以算出 \(x^N\equiv a(mod~p)\) 的解 首先可以算出 \(P\) 的原根 \(g\) 解方程 \(g^y\equi ...

  8. mac上调整phpstorm和webstorm的使用内存(默认是128m-750m) 避免卡顿

    For Mac Only WebStorm/phpstrom用起来一卡一卡,如今才发现是它的默认内存配置太弱.修改之: 修改phpstrom vi /Applications/PhpStorm.app ...

  9. CSS选择器:#id和.class中间有空格和无空格的区别

    相信大家都知道 .class1 .class2 和 .class1.class2 是两种不同的选择规则,但具体怎样不同呢? 首先中间有空格的情况:是选择到.class1类下的.class2类子节点,即 ...

  10. 纯css 画气泡

    我们知道运用css可以绘画出各式各样的形状:三角形,圆形,正方形,椭圆形,平行四边形等等,而通过他们之间进行两两组合可以变换出各种意想不到的效果图,气泡框就是其中一个.最简单的气泡框就是一个矩形框+一 ...