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爬虫框架Scrapy安装使用步骤
Apr 01 Python
Python实现栈的方法
May 26 Python
玩转python selenium鼠标键盘操作(ActionChains)
Apr 12 Python
使用pyecharts在jupyter notebook上绘图
Apr 23 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
Dec 05 Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 Python
python列表推导式入门学习解析
Dec 02 Python
解决Tensorboard 不显示计算图graph的问题
Feb 15 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
Mar 12 Python
Python的历史与优缺点整理
May 26 Python
Pycharm配置autopep8实现流程解析
Nov 28 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 htmlentities()函数的定义和用法
2016/05/13 PHP
PHP 读取大文件并显示的简单实例(推荐)
2016/08/12 PHP
PHP调用全国天气预报数据接口查询天气示例
2019/02/20 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
JavaScript模块规范之AMD规范和CMD规范
2015/10/27 Javascript
js简单设置与使用cookie的方法
2016/01/22 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
2018/08/17 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
Vue实现的父组件向子组件传值功能示例
2019/01/19 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
JavaScript实现图片的放大缩小及拖拽功能示例
2019/05/14 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
Python socket C/S结构的聊天室应用实现
2014/11/30 Python
python函数局部变量用法实例分析
2015/08/04 Python
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
详解Python3序列赋值、序列解包
2019/05/14 Python
python机器学习库xgboost的使用
2020/01/20 Python
python3爬虫中异步协程的用法
2020/07/10 Python
Java编程面试题
2016/04/04 面试题
幼儿教师个人求职信范文
2013/09/21 职场文书
大学生优秀的自我评价分享
2013/10/22 职场文书
2014学雷锋活动总结
2014/03/09 职场文书
学习两会精神心得范文
2014/03/17 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
2016年社会主义核心价值观心得体会
2016/01/21 职场文书