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 文件操作技巧(File operation) 实例代码分析
Aug 11 Python
python 文件与目录操作
Dec 24 Python
Python文件和目录操作详解
Feb 08 Python
linux下python抓屏实现方法
May 22 Python
Python下载网络文本数据到本地内存的四种实现方法示例
Feb 05 Python
python使用matplotlib画饼状图
Sep 25 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
python实现二分类的卡方分箱示例
Nov 22 Python
Django框架反向解析操作详解
Nov 28 Python
python线程信号量semaphore使用解析
Nov 30 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
Feb 07 Python
详解python itertools功能
Feb 07 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 判断数组是几维数组
2013/03/20 PHP
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
jQuery实现指定内容滚动同时左侧或其它地方不滚动的方法
2015/08/08 Javascript
JS+CSS实现自动切换的网页滑动门菜单效果代码
2015/09/14 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
jQuery学习笔记之Ajax用法实例详解
2015/12/01 Javascript
AngularJS中$interval的用法详解
2016/02/02 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
Bootstrap媒体对象学习使用
2017/03/07 Javascript
Easyui在treegrid添加控件的实现方法
2017/06/23 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
2017/07/24 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
基于JavaScript实现表格隔行换色
2020/05/08 Javascript
js瀑布流布局的实现
2020/06/28 Javascript
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
Python里隐藏的“禅”
2014/06/16 Python
详解Python的Flask框架中的signals信号机制
2016/06/13 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
python中最小二乘法详细讲解
2021/02/19 Python
澳大利亚冲浪和时尚服装网上购物:SurfStitch
2017/07/29 全球购物
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
Linux中如何设置Java环境变量(Ubuntu)
2016/07/24 面试题
婚礼新郎父母答谢词
2014/01/16 职场文书
老师对学生的寄语
2014/04/09 职场文书
事业单位鉴定材料
2014/05/25 职场文书
分公司经理任命书
2014/06/05 职场文书
民事授权委托书范文
2014/08/02 职场文书
2015年食品安全宣传周活动总结
2015/07/09 职场文书
Vue实现动态查询规则生成组件
2021/05/27 Vue.js