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 相关文章推荐
Python编程中的文件操作攻略
Oct 16 Python
Python中__init__.py文件的作用详解
Sep 18 Python
CentOS7.3编译安装Python3.6.2的方法
Jan 22 Python
Python实现的多项式拟合功能示例【基于matplotlib】
May 15 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
Aug 15 Python
python实现简易学生信息管理系统
Apr 05 Python
Tensorflow 实现释放内存
Feb 03 Python
解决Keras中CNN输入维度报错问题
Jun 29 Python
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
Mar 29 Python
python 中yaml文件用法大全
Jul 04 Python
Python使用Web框架Flask开发项目
Jun 01 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
ecshop 订单确认中显示省市地址信息的方法
2010/03/15 PHP
php+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
2019/05/31 PHP
js里的prototype使用示例
2010/11/19 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
js不完美解决click和dblclick事件冲突问题
2012/07/16 Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
2013/04/19 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
JScript中的条件注释详解
2015/04/24 Javascript
javascript使用avalon绑定实现checkbox全选
2015/05/06 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
详解如何在Vue2中实现组件props双向绑定
2017/03/29 Javascript
如何以Angular的姿势打开Font-Awesome详解
2018/04/22 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
微信公众平台 发送模板消息(Java接口开发)
2019/04/17 Javascript
Layui事件监听的实现(表单和数据表格)
2019/10/17 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
[10:07]2014DOTA2国际邀请赛 实拍选手现场观战DK对阵Titan
2014/07/12 DOTA
Python的lambda匿名函数的简单介绍
2013/04/25 Python
Python yield 小结和实例
2014/04/25 Python
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
python实现实时监控文件的方法
2016/08/26 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
Python+selenium 获取一组元素属性值的实例
2018/06/22 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
德国隐形眼镜店:LuckyLens
2018/07/29 全球购物
暑期社会实践学生的自我评价
2014/01/09 职场文书
运动会演讲稿100字
2014/08/25 职场文书
关于实现中国梦的心得体会
2016/01/05 职场文书
《七律·长征》教学反思
2016/02/16 职场文书