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之??碌某?? target=
Sep 12 Python
Python实现读取目录所有文件的文件名并保存到txt文件代码
Nov 22 Python
Python中datetime常用时间处理方法
Jun 15 Python
python插入排序算法实例分析
Jul 03 Python
Python遍历目录并批量更换文件名和目录名的方法
Sep 19 Python
对python numpy数组中冒号的使用方法详解
Apr 17 Python
python多行字符串拼接使用小括号的方法
Mar 19 Python
Python数据分析matplotlib设置多个子图的间距方法
Aug 03 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
python脚本第一行如何写
Aug 30 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
Dec 31 Python
Python实现将多张图片合成MP4视频并加入背景音乐
Apr 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
smarty巧妙处理iframe中内容页的代码
2012/03/07 PHP
php代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
php实现的xml操作类
2016/01/15 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
js实现三张图(文)片一起切换的banner焦点图
2015/08/25 Javascript
jQuery实现的简洁下拉菜单导航效果代码
2015/08/26 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
AngularJS 作用域详解及示例代码
2016/08/17 Javascript
vue中SPA单页面应用程序详解
2017/11/07 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
对于防止按钮重复点击的尝试详解
2019/04/22 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
[01:02:17]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG
2014/05/26 DOTA
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
Python sys.argv用法实例
2015/05/28 Python
Python中多线程的创建及基本调用方法
2016/07/08 Python
Django如何实现内容缓存示例详解
2017/09/24 Python
python不换行之end=与逗号的意思及用途
2017/11/21 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
2017/12/28 Python
python地震数据可视化详解
2019/06/18 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
wxPython色环电阻计算器
2019/11/18 Python
python 多线程中join()的作用
2020/10/29 Python
python 实现批量图片识别并翻译
2020/11/02 Python
Python中return函数返回值实例用法
2020/11/19 Python
CSS3 特效范例整理
2011/08/22 HTML / CSS
利用html5 canvas破解简单验证码及getImageData接口应用
2013/01/25 HTML / CSS
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
2014年基建工作总结
2014/12/12 职场文书
优秀教师申报材料
2014/12/16 职场文书
学子宴致辞大全
2015/07/27 职场文书