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解析excel文件存入sqlite数据库的方法
Nov 15 Python
浅谈终端直接执行py文件,不需要python命令
Jan 23 Python
浅谈Django自定义模板标签template_tags的用处
Dec 20 Python
python合并同类型excel表格的方法
Apr 01 Python
在Django中输出matplotlib生成的图片方法
May 24 Python
Python在for循环中更改list值的方法【推荐】
Aug 17 Python
Python中的 sort 和 sorted的用法与区别
Aug 10 Python
关于Python 常用获取元素 Driver 总结
Nov 24 Python
浅谈tensorflow中张量的提取值和赋值
Jan 19 Python
Pycharm中如何关掉python console
Oct 27 Python
python中pow函数用法及功能说明
Dec 04 Python
Python之多进程与多线程的使用
Feb 23 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
VML绘图板②脚本--VMLgraph.js、XMLtool.js
2006/10/09 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
php浏览历史记录的方法
2015/03/10 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
PHP房贷计算器实例代码,等额本息,等额本金
2017/04/01 PHP
JqGrid web打印实现代码
2011/05/31 Javascript
js 时间函数应用加、减、比较、格式转换的示例代码
2013/08/23 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
jQuery日历插件datepicker用法详解
2016/03/03 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
EsLint入门学习教程
2017/02/17 Javascript
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
ElementUI radio组件选中小改造
2019/08/12 Javascript
js实现缓动动画
2020/11/25 Javascript
详解Vue.js 可拖放文本框组件的使用
2021/03/03 Vue.js
python使用心得之获得github代码库列表
2014/06/25 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
python3 实现调用串口功能
2019/12/26 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
Gap工厂店:Gap Factory
2017/11/02 全球购物
馥绿德雅美国官方网站:Rene Furterer头皮护理专家
2019/05/01 全球购物
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
一道输出判断型Java面试题
2014/10/01 面试题
治庸问责心得体会
2014/09/12 职场文书
实习协议书范本
2014/09/25 职场文书
助学感谢信范文
2015/01/21 职场文书
黑白记忆观后感
2015/06/18 职场文书
消防安全培训工作总结
2015/10/23 职场文书
Python Pandas常用函数方法总结
2021/06/15 Python
python基础之文件操作
2021/10/24 Python
AngularJS实现多级下拉框
2022/03/25 Javascript
ipad隐藏软件app图标方法
2022/04/19 数码科技