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 相关文章推荐
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
Mar 05 Python
libreoffice python 操作word及excel文档的方法
Jul 04 Python
pycharm重命名文件的方法步骤
Jul 29 Python
python实现单链表的方法示例
Sep 03 Python
Python简易计算器制作方法代码详解
Oct 31 Python
keras模型保存为tensorflow的二进制模型方式
May 25 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
Jun 14 Python
Python 必须了解的5种高级特征
Sep 10 Python
Python 实现集合Set的示例
Dec 21 Python
如何用Django处理gzip数据流
Jan 29 Python
有趣的二维码:使用MyQR和qrcode来制作二维码
May 10 Python
Python使用MapReduce进行简单的销售统计
Apr 22 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下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
解析PHP中的正则表达式以及模式匹配
2013/06/19 PHP
PHP-FPM 的管理和配置详解
2019/02/17 PHP
用js 让图片在 div或dl里 居中,底部对齐
2008/01/21 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
Javascript验证上传图片大小[前台处理]
2014/07/18 Javascript
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
微信小程序 支付功能(前端)的实现
2017/05/24 Javascript
React 组件转 Vue 组件的命令写法
2018/02/28 Javascript
详解微信小程序开发用户授权登陆
2019/04/24 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
基于openlayers实现角度测量功能
2020/09/28 Javascript
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
python 域名分析工具实现代码
2009/07/15 Python
python每次处理固定个数的字符的方法总结
2013/01/29 Python
python抓取百度首页的方法
2015/05/19 Python
浅谈Python2获取中文文件名的编码问题
2018/01/09 Python
python实现Zabbix-API监控
2018/09/17 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
浅析Python requests 模块
2020/10/09 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
一文彻底解决HTML5页面中长按保存图片功能
2019/06/10 HTML / CSS
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
Mamas & Papas沙特阿拉伯:英国最受欢迎的婴儿品牌
2017/11/20 全球购物
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
西部世纪面试题
2014/12/05 面试题
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
培训讲师邀请函
2014/01/10 职场文书
建筑管理专业求职信
2014/07/28 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
运动会新闻稿
2015/07/17 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
Windows Server 版本 20H2 于 8 月 9 日停止支持,Win10 版本 21H1 将于 12 月结束支
2022/07/23 数码科技