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 相关文章推荐
Python3读取文件常用方法实例分析
May 22 Python
详解在Python的Django框架中创建模板库的方法
Jul 20 Python
Python内置函数 next的具体使用方法
Nov 24 Python
Python解析命令行读取参数--argparse模块使用方法
Jan 23 Python
Python global全局变量函数详解
Sep 18 Python
使用python将图片格式转换为ico格式的示例
Oct 22 Python
Python中字符串与编码示例代码
May 20 Python
Django Docker容器化部署之Django-Docker本地部署
Oct 09 Python
Django配置文件代码说明
Dec 04 Python
通过实例解析python描述符原理作用
Jan 22 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
手把手教你实现PyTorch的MNIST数据集
Jun 28 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
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
PHP使用数组实现矩阵数学运算的方法示例
2017/05/29 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
2017/06/21 PHP
jQuery LigerUI 插件介绍及使用之ligerDrag和ligerResizable示例代码打包
2011/04/06 Javascript
精心挑选的12款优秀的基于jQuery的手风琴效果插件和教程
2012/08/22 Javascript
JS中Iframe之间传值的方法
2013/03/11 Javascript
jQuery实现带渐显效果的人物多级关系图代码
2015/10/16 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
JavaScript驾驭网页-DOM
2016/03/24 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
2018/06/25 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
简单解析Django框架中的表单验证
2015/07/17 Python
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
2019/05/23 Python
解决Django migrate不能发现app.models的表问题
2019/08/31 Python
python 有效的括号的实现代码示例
2019/11/11 Python
PyTorch中的C++扩展实现
2020/04/02 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
利用Python实现自动扫雷小脚本
2020/12/17 Python
CSS3颜色值RGBA与渐变色使用介绍
2020/03/06 HTML / CSS
Annoushka英国官网:英国奢侈珠宝品牌
2018/10/20 全球购物
经济管理专业毕业生推荐信
2013/11/11 职场文书
医学实习生自我鉴定
2013/12/12 职场文书
分厂厂长岗位职责
2013/12/29 职场文书
反对邪教标语
2014/06/30 职场文书
四风查摆问题自查报告
2014/10/10 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
python小型的音频操作库mp3Play
2022/04/24 Python
Java死锁的排查
2022/05/11 Java/Android
Vue2项目中对百度地图的封装使用详解
2022/06/16 Vue.js