在读取dictkeyvalue时,如果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,其valuedefault,并返回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_factoryNone,则与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内又含有dictkey嵌套获取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的几种方法相关推荐

  1. Python操作dict时避免出现KeyError的几种方法

    见原文:https://www.polarxiong.com/archives/Python-%E6%93%8D%E4%BD%9Cdict%E6%97%B6%E9%81%BF%E5%85%8D%E5% ...

  2. 操作dict时避免出现KeyError的几种方法

    参考博客http://blog.csdn.net/u011089523/article/details/72887163 常用异常处理http://www.jb51.net/article/41972 ...

  3. python keyerror5种方法_Python操作dict时避免出现KeyError的几种解决方法

    在读取dict的key和value时,如果key不存在,就会触发KeyError错误,如: t = { "a": "1", "b": &qu ...

  4. Python遍历列表时删除元素的几种方法

    问题来源: 删除列表中的指定元素 描述: 输入一个整数列表,并输入一个整数x,删除列表中所有值为x的数,再输出列表. 问题代码: a = list(eval(input())) x = eval(in ...

  5. 【基础】python操作Word时,自动更新目录(二)

    系列文 python-docx-template包之----为文字自定义格式(一) python-docx-template包之----设置表格(二) python-docx-template包之-- ...

  6. Python炫技操作:花式导包的八种方法

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 五岳寻仙不辞远,一身好入名山游. ...

  7. Python实现将内容写入文件的五种方法总结

    本篇带你详细看一下python将内容写入文件的方法以及细节,主要包括write()方法.writelines() 方法.print() 函数.使用 csv 模块.使用 json 模块,需要的可以参考一 ...

  8. python怎么清屏_python实现清屏的方法 Python Shell中清屏一般有两种方法。

    Python Shell 怎样清屏? Python Shell中清屏一般有两种方法. 奈何一个人随着年龄增长,梦想便不复轻盈:他开始用双手掂量生活,更看重果实而非花朵.--叶芝<凯尔特的搏暮&g ...

  9. python列表list元素降序排列两种方法

    python列表list元素降序排列的两种方法 sort()方法 python列表内置了一个sort()方法,可以用于为元素列表进行排序,当将默认参数reverse设置为True,sort()方法将为 ...

最新文章

  1. KDE vs GNOME: 设置,应用和小工具
  2. Azure 网站的新增功能:可配置的环境变量
  3. python(matplotlib3)——ticks(坐标刻度)能见度
  4. SSH整合(Struts2+hibernate+spring)
  5. mysql数据库导入导出_MySQL数据库导入导出详解
  6. vue项目实现列表页-详情页返回不刷新,再点其他菜单项返回刷新的需求
  7. python字典中的值只能是字符串类型_python字典key不能是可以是啥类型
  8. java 整数变负数_年年有余之java求余的小技巧
  9. 迭代器模式(Iterator)解析例子
  10. matlab 省略号,matlab知识集锦 | 学步园
  11. cboard企业版源码_Cboard 搭建和初步试用文档
  12. 图片验证码的实现以及校验验证码
  13. ­«持续更新«计算机名词梳理(知识点概括,名词解析,简答题)
  14. ts的.d.ts和declare究竟是干嘛用的
  15. 现在俏皮话越来越多了
  16. Stochastic Variance Reduced Ensemble Adversarial Attack for Boosting the Adversarial Transferability
  17. 《大话脑成像》之Linux基础命令
  18. win10中用命令行打开画图
  19. [论文阅读]Road Mapping and Localization using Sparse Semantic Visual Features
  20. 重要性采样和多重重要性采样在路径追踪中的应用

热门文章

  1. 株洲小巨蛋项目开发总结
  2. 【论文笔记】Image Privacy Prediction Using Deep Neural Networks
  3. SM4分组加密算法原理和c语言实现
  4. 使用c++开发web后端接口
  5. 图解二进制,带你揭开二进制的神秘面纱
  6. C:提高C代码运行效率的方法有哪些?列举几个提高代码执行效率的方法
  7. 【HTML学习】第四章 更丰富的内容标记方法
  8. 外汇天眼:Swissquote获得CySEC许可证、BUX收购Ninety Nine
  9. GAN(Generative Adversarial Network)
  10. 业务中的字典表的MySQL实现方案