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中的引用和拷贝浅析
Nov 22 Python
Python自定义scrapy中间模块避免重复采集的方法
Apr 07 Python
Windows下搭建python开发环境详细步骤
Jul 20 Python
Django使用httpresponse返回用户头像实例代码
Jan 26 Python
PyGame贪吃蛇的实现代码示例
Nov 21 Python
Django模型修改及数据迁移实现解析
Aug 01 Python
pandas factorize实现将字符串特征转化为数字特征
Dec 19 Python
Python利用Scrapy框架爬取豆瓣电影示例
Jan 17 Python
ansible动态Inventory主机清单配置遇到的坑
Jan 19 Python
jupyter notebook 参数传递给shell命令行实例
Apr 10 Python
高考考python编程是真的吗
Jul 20 Python
Python按顺序遍历并读取文件夹中文件
Apr 29 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
Oracle Faq(Oracle的版本)
2006/10/09 PHP
一个捕获函数输出的函数
2007/02/14 PHP
escape unescape的php下的实现方法
2007/04/27 PHP
PHP如何将log信息写入服务器中的log文件
2015/07/29 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
PHP获取MySQL执行sql语句的查询时间方法
2018/08/21 PHP
JS+CSS实现带关闭按钮DIV弹出窗口的方法
2015/02/27 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
JQuery 封装 Ajax 常用方法(推荐)
2017/05/21 jQuery
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
javascript完美实现给定日期返回上月日期的方法
2017/06/15 Javascript
Vue基于NUXT的SSR详解
2017/10/24 Javascript
JS滚轮控制图片缩放大小和拖动的实例代码
2018/11/20 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
2019/11/26 Javascript
js实现小时钟效果
2020/03/25 Javascript
vue实现按钮切换图片
2021/01/20 Vue.js
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python循环监控远程端口的方法
2015/03/14 Python
python开发之字符串string操作方法实例详解
2015/11/12 Python
Python之str操作方法(详解)
2017/06/19 Python
Python常见数字运算操作实例小结
2019/03/22 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
2019/08/09 Python
如何卸载python插件
2020/07/08 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
美国名牌香水折扣网站:Hottperfume
2021/02/10 全球购物
大学毕业生工作的自我评价
2013/10/01 职场文书
视光学毕业生自荐书范文
2014/02/13 职场文书
六一亲子活动总结
2014/07/01 职场文书
关于美容院的活动方案
2014/08/14 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书
党员群众路线教育实践活动剖析材料
2014/10/10 职场文书
运动会班级口号霸气押韵
2015/12/24 职场文书
学生会2016感恩节活动小结
2016/04/01 职场文书