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下载Python最新源码,二进制文档,新闻资讯等可以在Python的官网查看到:Python官网:http://www.pyth
- 本文实例讲述了Python3.5 Pandas模块之DataFrame用法。分享给大家供大家参考,具体如下:1、DataFrame的创建(1
- 我们在编写Python爬虫时,有时会遇到网站拒绝访问等反爬手段,比如这么我们想爬取蚂蚁短租数据,它则会提示“当前访问疑似黑客攻击,已被网站管
- 比如,在使用DWR的时候,如果你想传递下拉框的参数到后台的话,此时就需要先获取到下拉框的值了。 其实想要获取到下拉框的值是很简单的。 最关键
- 本文将和大家分享一些从互联网上爬取语料的经验。0x1 工具准备工欲善其事必先利其器,爬取语料的根基便是基于python。我们基于python
- 前言本文主要介绍的是用yum安装MySQLdb模块的步骤,下面话不多说了,来看看详细的介绍吧。步骤如下MySQLdb依赖于mysql-dev
- overflow:hidden 用在div上时很好用,但直接用在td上,好像没有任何效果。td中的文本过长时依然自动换了一行像下面这要设定一
- 在广大网友心目中,他们就是中国互联网搜索领域的三驾马车。无论这三家搜索巨头承不承认,在网友眼中总会来将他们进行对比比较。当然,更多时候的比较
- WinHttp; // Microsoft WinHTTP Services, version 5.1Alias HTTPREQUEST_P
- /*Bresenham画圆算法*/var arc = function(x0,y0,r){/*起点坐标x0,y
- 摘要:python的设计核心原则就是简洁——在这种原则的指导下,诞生了lambda表达式和偏函数:二者都让函数调用变得简洁。本文主要为你介绍
- 本文实例讲述了python类继承与子类实例初始化用法。分享给大家供大家参考。具体分析如下:[ 先贴参考书籍原文(中文英文对照)]__init
- 在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流!为了保证在业务高峰期,线上系统也能保证一定的弹性和稳定性,最有效的方案就是进行服
- 一 前言官方解释:https://www.elastic.co/guide/en/elasticsearch/reference/6.0/r
- 一.运行效果先说两句,之前我在网上找的相关文章标题上写的是处理多连接,尼玛,全是假的。网上那些,根本不能异步处理多连接,不能主动给客户端发消
- 如下所示:#!/usr/bin/python#-*- coding: utf-8 -*-fin=open('add_1.txt
- 前段时间用C语言做了个字符版的推箱子,着实是比较简陋。正好最近用到了Python,然后想着用Python做一个图形界面的推箱子。这回可没有C
- 提到numpy数组就不得不说到np.hstack()与np.dstack()的问题。这里我们研究一下它们的使用方法。我们先来看 一下np.h
- 个人理解:动态路由不同于常见的静态路由,可以根据不同的「因素」而改变站点路由列表。常见的动态路由大都是用来实现:多用户权限系统不同用户展示不
- 使用步骤大致分为两步,就不多废话第一步、修改hosts文件将0.0.0.0 account.jetbrains.com添加到hosts文件最