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简单的函数定义和用法实例
May 07 Python
Python设计模式中单例模式的实现及在Tornado中的应用
Mar 02 Python
ubuntu安装sublime3并配置python3环境的方法
Mar 15 Python
Python 实现数据结构-循环队列的操作方法
Jul 17 Python
Python创建数字列表的示例
Nov 28 Python
flask的orm框架SQLAlchemy查询实现解析
Dec 12 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
Jan 04 Python
python with (as)语句实例详解
Feb 04 Python
python 遗传算法求函数极值的实现代码
Feb 11 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
Mar 20 Python
Python3操作读写CSV文件使用包过程解析
Apr 10 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
Nov 11 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
PHP 各种排序算法实现代码
2009/08/20 PHP
laravel实现按月或天或小时统计mysql数据的方法
2019/10/09 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
基于jquery的滚动鼠标放大缩小图片效果
2011/10/27 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
2014/01/24 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
2015/08/24 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
python使用循环实现批量创建文件夹示例
2014/03/25 Python
python中assert用法实例分析
2015/04/30 Python
Python实现Linux命令xxd -i功能
2016/03/06 Python
浅谈Python的文件类型
2016/05/30 Python
浅谈django开发者模式中的autoreload是如何实现的
2017/08/18 Python
Python中str.join()简单用法示例
2018/03/20 Python
centos7之Python3.74安装教程
2019/08/15 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
Python argparse模块应用实例解析
2019/11/15 Python
css3 transform属性详解
2014/09/30 HTML / CSS
英国工艺品购物网站:Minerva Crafts
2018/01/29 全球购物
什么是属性访问器
2015/10/26 面试题
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
如何整合JQuery和Prototype
2014/01/31 面试题
高中班长自我鉴定
2013/12/20 职场文书
花店创业计划书范文
2014/02/07 职场文书
家教广告词
2014/03/19 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
《我要的是葫芦》教学反思
2016/02/18 职场文书
物业管理交接协议书
2016/03/24 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书
python创建字典及相关管理操作
2022/04/13 Python
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS