Python操作dict时避免出现KeyError的几种解决方法


Posted in Python onSeptember 20, 2020

在读取dict的key和value时,如果key不存在,就会触发KeyError错误,如:

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

就会出现:

KeyError: 'd'

第一种解决方法

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

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

会出现:

not exist

第二种解决方法

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

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

会出现:

None

加上default参数:

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

会出现:

not exist
{'a': '1', 'c': '3', 'b': '2'}

第三种解决方法

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

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

会出现:

None
{'b': '2', 'd': None, 'a': '1', 'c': '3'}

加上default参数:

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

会出现:

not exist
{'c': '3', 'd': 'not exist', 'a': '1', 'b': '2'}

第四种解决方法

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

t = {
  'a': '1',
  'b': '2',
  'c': '3',
}

class Counter(dict):

  def __missing__(self, key):
    return None
c = Counter(t)
print(c['d'])

会出现:

None

更改return值:

t = {
  'a': '1',
  'b': '2',
  'c': '3',
}

class Counter(dict):

  def __missing__(self, key):
    return key
c = Counter(t)
print(c['d'])
print(c)

会出现:

d
{'c': '3', 'a': '1', 'b': '2'}

第五种解决方法

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

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

会出现:

KeyError: 'd'

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

import collections
t = {
  'a': '1',
  'b': '2',
  'c': '3',
}

def handle():
  return None
t = collections.defaultdict(handle, t)
print(t['d'])

会出现:

None

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

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

会出现:

0

又如:

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

会出现:

[]

注意:

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

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

会出现:

KeyError: 'y'

到此这篇关于Python操作dict时避免出现KeyError的几种解决方法的文章就介绍到这了,更多相关Python操作dict出现KeyError内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
kNN算法python实现和简单数字识别的方法
Nov 18 Python
在Python中操作字典之setdefault()方法的使用
May 21 Python
json跨域调用python的方法详解
Jan 11 Python
python3.5 email实现发送邮件功能
May 22 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
Aug 07 Python
使用python PIL库实现简单验证码的去噪方法步骤
May 10 Python
Flask框架工厂函数用法实例分析
May 25 Python
python网络爬虫 CrawlSpider使用详解
Sep 27 Python
解决Tensorflow占用GPU显存问题
Feb 03 Python
tensorflow实现二维平面模拟三维数据教程
Feb 11 Python
解决c++调用python中文乱码问题
Jul 29 Python
selenium+超级鹰实现模拟登录12306
Jan 24 Python
python中random.randint和random.randrange的区别详解
Sep 20 #Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
Sep 20 #Python
Python Pillow(PIL)库的用法详解
Sep 19 #Python
Python自动化xpath实现自动抢票抢货
Sep 19 #Python
python 贪心算法的实现
Sep 18 #Python
详解KMP算法以及python如何实现
Sep 18 #Python
python实现二分查找算法
Sep 18 #Python
You might like
PHP实现GIF图片验证码
2015/11/04 PHP
利用PHP实现一个简单的用户登记表示例
2017/04/25 PHP
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
AngularJS路由切换实现方法分析
2017/03/17 Javascript
JSONP基础知识详解
2017/03/19 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
JavaScript异步加载问题总结
2018/02/17 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
2018/03/01 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
layui数据表格跨行自动合并的例子
2019/09/02 Javascript
layui树形菜单动态遍历的例子
2019/09/23 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
python 实现文件的递归拷贝实现代码
2012/08/02 Python
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
python email smtplib模块发送邮件代码实例
2018/04/26 Python
python中的二维列表实例详解
2018/06/19 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
linux环境下Django的安装配置详解
2019/07/22 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
tensorflow 实现数据类型转换
2020/02/17 Python
Python configparser模块常用方法解析
2020/05/22 Python
python爬虫判断招聘信息是否存在的实例代码
2020/11/20 Python
Python数据模型与Python对象模型的相关总结
2021/01/26 Python
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
全球最大的游戏市场:G2A
2018/07/05 全球购物
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
同意转租证明
2015/06/24 职场文书
《观潮》教学反思
2016/02/17 职场文书
Windows Server 版本 20H2 于 8 月 9 日停止支持,Win10 版本 21H1 将于 12 月结束支
2022/07/23 数码科技