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中多线程编程的队列运作示例
Apr 16 Python
使用Python的Tornado框架实现一个Web端图书展示页面
Jul 11 Python
python实现可以断点续传和并发的ftp程序
Sep 13 Python
Python编程之Re模块下的函数介绍
Oct 28 Python
SVM基本概念及Python实现代码
Dec 27 Python
Python中join函数简单代码示例
Jan 09 Python
Python爬虫:url中带字典列表参数的编码转换方法
Aug 21 Python
Python实现中值滤波去噪方式
Dec 18 Python
PyTorch的torch.cat用法
Jun 28 Python
如何解决cmd运行python提示不是内部命令
Jul 01 Python
python 贪心算法的实现
Sep 18 Python
Python3使用tesserocr识别字母数字验证码的实现
Jan 29 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程序之die调试法 快速解决错误
2009/09/17 PHP
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
php画图实例
2014/11/05 PHP
PHP使用逆波兰式计算工资的方法
2015/07/29 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
JavaScript 基本概念
2015/01/20 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
Flexible.js可伸缩布局实现方法详解
2020/11/13 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
2021/02/06 Javascript
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
python类和函数中使用静态变量的方法
2015/05/09 Python
Python实现翻转数组功能示例
2018/01/12 Python
Python实现决策树C4.5算法的示例
2018/05/30 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
关于python导入模块import与常见的模块详解
2019/08/28 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
基于CentOS搭建Python Django环境过程解析
2020/08/24 Python
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
html5 canvas-2.用canvas制作一个猜字母的小游戏
2013/01/07 HTML / CSS
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
电子商务专员岗位职责
2013/12/11 职场文书
大学生英文求职信范文
2015/03/19 职场文书
2015最新民情日记范文
2015/06/26 职场文书
Python实现简单的猜单词
2021/06/15 Python
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL
浅谈克隆 JavaScript
2021/11/02 Javascript
Python 统计序列中元素的出现频度
2022/04/26 Python