Python操作dict时避免出现KeyError的几种解决方法

作者:风景不在对岸wj 时间:2022-12-30 14:48:26 

在读取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'

来源:https://blog.csdn.net/u011089523/article/details/72887163

标签:Python,dict,KeyError
0
投稿

猜你喜欢

  • python3.6的venv模块使用详解

    2023-05-11 12:13:41
  • django ModelForm修改显示缩略图 imagefield类型的实例

    2021-04-28 16:16:37
  • 38个Asp内置函数介绍

    2008-11-27 16:25:00
  • 提高ASP性能的最佳选择第一部分

    2007-08-15 12:31:00
  • 也来谈谈”完美”跨域

    2008-12-19 12:34:00
  • python使用tqdm模块处理文件阅读进度条显示

    2022-09-08 11:29:17
  • 用一个案例讲解SQL Server数据库恢复

    2008-11-28 14:17:00
  • python替换字符串中的子串图文步骤

    2021-06-23 22:02:47
  • pytest实现多进程与多线程运行超好用的插件

    2023-03-23 15:56:23
  • PHP开启opcache提升代码性能

    2023-06-17 04:39:55
  • JSQL 批量图片切换的实现代码

    2023-09-05 06:47:59
  • python super()函数的详解

    2023-08-08 10:09:42
  • Python模板的使用详细讲解

    2022-03-20 13:24:08
  • python中的计时器timeit的使用方法

    2023-04-24 14:50:56
  • mysql 存储过程 使用小结

    2010-10-25 20:02:00
  • Scrapy元素选择器Xpath用法汇总

    2021-09-11 11:42:58
  • python神经网络tf.name_scope和tf.variable_scope函数区别

    2021-01-24 13:10:48
  • 基于python,Matplotlib绘制函数的等高线与三维图像

    2021-09-06 08:51:33
  • Ubuntu16.04/树莓派Python3+opencv配置教程(分享)

    2023-03-30 12:38:59
  • Python导入数值型Excel数据并生成矩阵操作

    2023-05-15 16:59:24
  • asp之家 网络编程 m.aspxhome.com