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基于辗转相除法求解最大公约数的方法示例
Apr 04 Python
Python不使用int()函数把字符串转换为数字的方法
Jul 09 Python
Python爬虫PyQuery库基本用法入门教程
Aug 04 Python
对python 自定义协议的方法详解
Feb 13 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
python装饰器常见使用方法分析
Jun 26 Python
Python使用matplotlib绘制三维参数曲线操作示例
Sep 10 Python
使用PyCharm进行远程开发和调试的实现
Nov 04 Python
Python hashlib加密模块常用方法解析
Dec 18 Python
Python的对象传递与Copy函数使用详解
Dec 26 Python
DataFrame 数据合并实现(merge,join,concat)
Jun 14 Python
python如何建立全零数组
Jul 19 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文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
PHP查询网站的PR值
2013/10/30 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
用JS判断IE版本的代码 超管用!
2011/08/09 Javascript
javascript显示用户停留时间的简单实例
2013/08/05 Javascript
让元素在网页中可拖动示例代码
2013/08/13 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
javascript标准库(js的标准内置对象)总结
2018/05/26 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
Python正则表达式匹配HTML页面编码
2015/04/08 Python
最基础的Python的socket编程入门教程
2015/04/23 Python
Python映射拆分操作符用法实例
2015/05/19 Python
Python使用smtplib模块发送电子邮件的流程详解
2016/06/27 Python
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
Python实现基于POS算法的区块链
2018/08/07 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
2018/10/22 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
pyenv与virtualenv安装实现python多版本多项目管理
2019/08/17 Python
使用Python函数进行模块化的实现
2019/11/15 Python
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
通息工程毕业生自荐信
2013/10/16 职场文书
教师节标语大全
2014/10/07 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
雷锋的故事观后感
2015/06/10 职场文书
选调生挂职锻炼工作总结
2015/10/23 职场文书
高中团支书竞选稿
2015/11/21 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python