在读取dictkeyvalue时,如果key不存在,就会触发KeyError错误,如:

Python
t = {
'a': '',
'b': '',
'c': '',
}
print(t['d'])

就会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">KeyError: 'd'
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

第一种解决方法

首先测试key是否存在,然后才进行下一步操作,如:

t = {
'a': '',
'b': '',
'c': '',
}
if 'd' in t:
print(t['d'])
else:
print('not exist')

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">not exist
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

第二种解决方法

利用dict内置的get(key[,default])方法,如果key存在,则返回其value,否则返回default;使用这个方法永远不会触发KeyError,如:

t = {
'a': '',
'b': '',
'c': '',
}
print(t.get('d'))

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">None
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

加上default参数:

t = {
'a': '',
'b': '',
'c': '',
}
print(t.get('d', 'not exist'))
print(t)

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">not exist
{'a': '1', 'c': '3', 'b': '2'}
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span><span style="display:block;"></span></span></code>

第三种解决方法

利用dict内置的setdefault(key[,default])方法,如果key存在,则返回其value;否则插入此key,其valuedefault,并返回default;使用这个方法也永远不会触发KeyError,如:

t = {
'a': '',
'b': '',
'c': '',
}
print(t.setdefault('d'))
print(t)

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">None
{'b': '2', 'd': None, 'a': '1', 'c': '3'}
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span><span style="display:block;"></span></span></code>

加上default参数:

t = {
'a': '',
'b': '',
'c': '',
}
print(t.setdefault('d', 'not exist'))
print(t)

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">not exist
{'c': '3', 'd': 'not exist', 'a': '1', 'b': '2'}
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span><span style="display:block;"></span></span></code>

第四种解决方法

向类dict增加__missing__()方法,当key不存在时,会转向__missing__()方法处理,而不触发KeyError,如:

t = {
'a': '',
'b': '',
'c': '',
} class Counter(dict): def __missing__(self, key):
return None
c = Counter(t)
print(c['d'])

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">None
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

更改return值:

t = {
'a': '',
'b': '',
'c': '',
} class Counter(dict): def __missing__(self, key):
return key
c = Counter(t)
print(c['d'])
print(c)

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">d
{'c': '3', 'a': '1', 'b': '2'}
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span><span style="display:block;"></span></span></code>

第五种解决方法

利用collections.defaultdict([default_factory[,...]])对象,实际上这个是继承自dict,而且实际也是用到的__missing__()方法,其default_factory参数就是向__missing__()方法传递的,不过使用起来更加顺手:
如果default_factoryNone,则与dict无区别,会触发KeyError错误,如:

import collections
t = {
'a': '',
'b': '',
'c': '',
}
t = collections.defaultdict(None, t)
print(t['d'])

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">KeyError: 'd'
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

但如果真的想返回None也不是没有办法:

import collections
t = {
'a': '',
'b': '',
'c': '',
} def handle():
return None
t = collections.defaultdict(handle, t)
print(t['d'])

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">None
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

如果default_factory参数是某种数据类型,则会返回其默认值,如:

import collections
t = {
'a': '',
'b': '',
'c': '',
}
t = collections.defaultdict(int, t)
print(t['d'])

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">0
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

又如:

import collections
t = {
'a': '',
'b': '',
'c': '',
}
t = collections.defaultdict(list, t)
print(t['d'])

会出现:

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;word-spacing:normal;line-height:inherit;border:0px;display:inline;">[]
<span class="line-numbers-rows" style="font-size:13.6px;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span style="display:block;"></span></span></code>

注意:
如果dict内又含有dictkey嵌套获取value时,如果中间某个key不存在,则上述方法均失效,一定会触发KeyError

import collections
t = {
'a': '',
'b': '',
'c': '',
}
t = collections.defaultdict(dict, t)
print(t['d']['y'])

实际操作:

for rb in data:
rb.setdefault('telephone') #当没有telephone时,设置为None

以上内容参考:https://blog.csdn.net/chenbindsg/article/details/73864045

操作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. Apache shiro集群实现 (八) web集群时session同步的3种方法

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  3. 【转】web集群时session同步的3种方法

    转载请注明作者:海底苍鹰地址:http://blog.51yip.com/server/922.html 在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问 ...

  4. web集群时session同步的3种方法[转]

    在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是 ...

  5. web集群时session同步的3种方法

    在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是 ...

  6. C# 给PDF签名时添加时间戳的2种方法(附VB.NET代码)

    在PDF添加签名时,支持添加可信时间戳来保证文档的法律效应.本文,将通过C#程序代码介绍如何添加可信时间戳,可通过2种方法来实现.文中附上VB.NET代码,有需可供参考. 一.程序运行环境 编译环境: ...

  7. 通过EF操作Sqlite时遇到的问题及解决方法

    1.使用Guid作为字段类型时,能存,能查,但是作为查询条件时查询不到数据 解决方法:连接字符串加上;binaryguid=False

  8. asp.net操作GridView添删改查的两种方法 及 光棒效果

    这部份小内容很想写下来了,因为是基础中的基础,但是近来用的比较少,又温习了一篇,发现有点陌生了,所以,还是写一下吧. 方法一:使用Gridview本身自带的事件处理,代码如下(注意:每次操作完都得重新 ...

  9. 一、winForm-DataGridView操作——控件绑定事件的两种方法

    在winForm窗体中绑定(注册)事件的方法有两种: 一.绑定事件 双击控件,即进入.cs的代码编辑页面,会出现 类似于“ private void 控件名称_Click(object sender, ...

随机推荐

  1. 从java到web前端再到php,一路走来的小总结

    java的学习: 初学者对Java的学习,上来的感觉都是比较难,感觉java的东西很多,如此多的类和接口.有时还弄不懂为啥实例化出一个int空数组为什么数组中默认都是0,实例化一个空字符串数组时(St ...

  2. Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构

    Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构 之前我们简要的看过了DataNode的main函数以及整个类的大至,现在结合前面我们研究的线程和RPC,则可以进一步 ...

  3. apache Header set Cache-Control

    设置静态页面的缓存最大值 在.htaccess中添加下面的代码 <FilesMatch "\.(flv|gif|jpg|jpeg|png|ico|swf)$"> Hea ...

  4. IO流的复习笔记

    IO字节流和缓冲流 IO字节流的读取和写入 读取 import java.io.FileInputStream; import java.io.FileNotFoundException; impor ...

  5. Hive & SparkSQL 比较

    Hive 在  Hadoop 集群上所有数据的访问都是通过 Java 编写的 MapReduce 作业来完成的,这些让 Java 程序员来完成没有问题. 但是对 SQL 程序员来说,写 MapRedu ...

  6. 记录一次teamview无法远程连接对方teamview的过程

    问题描述: teamviewer 提示 超时后连接被阻断.您的许可证对您与伙伴的最大话时间有所限制...... 解决方法: 1.先将自己的teamview完全卸载,连同安装目录一起删除.尽量卸载完全 ...

  7. 第三天-基本数据类型 int bool str

    # python基础数据类型 # 1. int 整数 # 2.str 字符串.不会用字符串保存大量的数据 # 3.bool 布尔值. True, False # 4.list 列表(重点) 存放大量的 ...

  8. Google APAC----Africa 2010, Qualification Round(Problem A. Store Credit)----Perl 解法

    原题地址链接:https://code.google.com/codejam/contest/351101/dashboard#s=p0 问题描述: Problem You receive a cre ...

  9. Http请求超时的一种处理方法

    URLConnection类常见的超时处理就是调用其setConnectTimeout和setReadTimeout方法: setConnectTimeout:设置连接主机超时(单位:毫秒) setR ...

  10. Mybatis学习第四天——Mybatis与Spring整合

    主要介绍mapper配置与mapper的扫描配置,使用dao层的配置这里不多说. 1.导包 1.1 Mybatis的jar包 1.2 Spring的jar包 1.3 Spring与Mybatis整合包 ...