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 图片验证码代码
Dec 07 Python
利用Python中的输入和输出功能进行读取和写入的教程
Apr 14 Python
python实现在windows服务中新建进程的方法
Jun 30 Python
详解Python命令行解析工具Argparse
Apr 20 Python
Linux中安装Python的交互式解释器IPython的教程
Jun 13 Python
Python 爬虫之Beautiful Soup模块使用指南
Jul 05 Python
使用python生成杨辉三角形的示例代码
Aug 29 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
Python socket模块ftp传输文件过程解析
Nov 05 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
Mar 16 Python
python 基于Apscheduler实现定时任务
Dec 15 Python
python之django路由和视图案例教程
Jul 26 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
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
PHP 伪静态技术原理以及突破原理实现介绍
2013/07/12 PHP
php实现建立多层级目录的方法
2014/07/19 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
让您的菜单不离网站
2006/10/03 Javascript
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
jquery的键盘事件修改代码
2011/02/24 Javascript
浅析document.ready和window.onload的区别讲解
2013/12/18 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
node.js中的fs.createReadStream方法使用说明
2014/12/17 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
深入理解vue-class-component源码阅读
2019/02/18 Javascript
在vue项目中使用sass语法问题
2019/07/18 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
layui按条件隐藏表格列的实例
2019/09/19 Javascript
Vue v-for循环之@click点击事件获取元素示例
2019/11/09 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
python tornado微信开发入门代码
2018/08/24 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
python实现词法分析器
2019/01/31 Python
pycharm软件实现设置自动保存操作
2020/06/08 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
高中生学习生活的自我评价
2013/11/27 职场文书
企业申诉管理制度
2014/01/30 职场文书
承诺书范文
2014/06/03 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
永远是春天观后感
2015/06/12 职场文书
文明礼貌主题班会
2015/08/14 职场文书