高效使用Python字典的清单


Posted in Python onApril 04, 2018

字典(dict)对象是 Python 最常用的数据结构,社区曾有人开玩笑地说:"Python企图用字典装载整个世界",字典在Python中的重要性不言而喻,这里整理了几个关于高效使用字典的清单,希望Python开发者可以在日常应用开发中合理利用,让代码更加 Pythonic。

1、用 in 关键字检查 key 是否存在

Python之禅中有一条开发哲学是:

There should be one-- and preferably only one --obvious way to do it.

尽量找一种,最好是唯一种显而易见的解决方案。Python2 中判断某个 key 是否存在字典中可使用 has_key 方法,另外一种方式是使用 in 关键字。但是强烈推荐使用后者,因为 in 的处理速度更快,另外一个原因是 has_key 这个方法在 Python3 被移除了,要想同时兼容py2和py3两个版本的代码,用 in 是最好的选择。

bad

d = {'name': 'python'}
if d.has_key('name'):
  pass
good
if 'name' in d:
  pass

2、用 get 获取字典中的值

关于获取字典中的值,一种简单的方式就是用d[x]访问该元素,但是这种情况在 key 不存在的情况下会报 KeyError 错误,当然你可以先用 in 操作检查 key 是否在字典中再获取,不过这种方式不符合 Python 之禅中说的:

Simple is better than complex.
Flat is better than nested.

好的代码应该是简单易懂的,扁平的代码结构更加可读。我们可以使用 get 方法来代替 if ... else

bad

d = {'name': 'python'}
if 'name' in d:
  print(d['hello'])
else:
  print('default')
good
print(d.get("name", "default"))

3、用 setdefault 为字典中不存在的 key 设置缺省值

data = [
    ("animal", "bear"),
    ("animal", "duck"),
    ("plant", "cactus"),
    ("vehicle", "speed boat"),
    ("vehicle", "school bus")
  ]

在做分类统计时,希望把同一类型的数据归到字典中的某种类型中,比如上面代码,把相同类型的事物用列表的形式重新组装,得到新的字典

groups = {}
>>> 
{'plant': ['cactus'], 
 'animal': ['bear', 'duck'], 
 'vehicle': ['speed boat', 'school bus']}

普通的方式就是先判断 key 是否已经存在,如果不存在则要先用列表对象进行初始化,再执行后续操作。而更好的方式就是使用字典中的 setdefault 方法。

bad
for (key, value) in data:
  if key in groups:
    groups[key].append(value)
  else:
    groups[key] = [value]
good
groups = {}
for (key, value) in data:
  groups.setdefault(key, []).append(value)

setdefault 的作用是:

如果 key 存在于字典中,那么直接返回对应的值,等效于 get 方法

如果 key 不存在字典中,则会用 setdefault 中的第二个参数作为该 key 的值,再返回该值。

4、用 defaultdict 初始化字典对象

如果不希望 d[x] 在 x 不存在时报错,除了在获取元素时使用 get 方法之外,另外一种方式是用 collections 模块中的 defaultdict,在初始化字典的时候指定一个函数,其实 defaultdict 是 dict 的子类。

from collections import defaultdict
groups = defaultdict(list)
for (key, value) in data:
  groups[key].append(value)

当 key 不存在于字典中时,list 函数将被调用并返回一个空列表赋值给 d[key],这样一来,你就不用担心调用 d[k] 会报错了。

5、用 fromkeys 将列表转换成字典

keys = {'a', 'e', 'i', 'o', 'u' }
value = []
d = dict.fromkeys(keys, value)
print(d)
>>>
{'i': [], 'u': [], 'e': [], 
 'a': [], 'o': []}

6、用字典实现 switch ... case 语句

Python 中没有 switch ... case 语句,这个问题Python之父龟叔表示这个语法过去没有,现在没有,以后也不会有。因为Python简洁的语法完全可以用 if ... elif 实现。如果有太多的分支判断,还可以使用字典来代替。

if arg == 0:
  return 'zero'
elif arg == 1:
  return 'one'
elif arg == 2:
  return "two"
else:
  return "nothing"
good
data = {
  0: "zero",
  1: "one",
  2: "two",
}
data.get(arg, "nothing")

7、使用 iteritems 迭代字典中的元素

python提供了几种方式迭代字典中的元素,第一种是使用 items 方法:

d = {
  0: "zero",
  1: "one",
  2: "two",
}
for k, v in d.items():
  print(k, v)

items 方法返回的是(key ,value)组成的列表对象,这种方式的弊端是迭代超大字典的时候,内存瞬间会扩大两倍,因为列表对象会一次性把所有元素加载到内存,更好的方式是使用 iteritems

for k, v in d.iteritems():
  print(k, v)

iteritems 返回的是迭代器对象,迭代器对象具有惰性加载的特性,只有真正需要的时候才生成值,这种方式在迭代过程中不需要额外的内存来装载这些数据。注意 Python3 中,只有 items 方法了,它等价于 Python2 中的 iteritems,而 iteritems 这个方法名被移除了。

8、使用字典推导式

推导式是个绝妙的东西,列表推导式一出,map、filter等函数黯然失色,自 Python2.7以后的版本,此特性扩展到了字典和集合身上,构建字典对象无需调用 dict 方法。

bad
numbers = [1,2,3]
d = dict([(number,number*2) for number in numbers])
good
numbers = [1, 2, 3]
d = {number: number * 2 for number in numbers}

总结

以上所述是小编给大家介绍的高效使用Python字典的清单,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python递归计算N!的方法
May 05 Python
python在控制台输出进度条的方法
Jun 20 Python
python构建自定义回调函数详解
Jun 20 Python
python机器学习实战之K均值聚类
Dec 20 Python
Python语言描述连续子数组的最大和
Jan 04 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
May 10 Python
Python使用cx_Freeze库生成msi格式安装文件的方法
Jul 10 Python
python3.4爬虫demo
Jan 22 Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 Python
python中的反斜杠问题深入讲解
Aug 12 Python
python中如何打包用户自定义模块
Sep 23 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
Dec 21 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 #Python
python 列表,数组,矩阵两两转换tolist()的实例
Apr 04 #Python
使用Python设计一个代码统计工具
Apr 04 #Python
用 Python 连接 MySQL 的几种方式详解
Apr 04 #Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 #Python
对numpy中数组元素的统一赋值实例
Apr 04 #Python
Python 元类实例解析
Apr 04 #Python
You might like
用文本文件实现的动态实时发布新闻的程序
2006/10/09 PHP
mysql,mysqli,PDO的各自不同介绍
2012/09/19 PHP
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
php基于Snoopy解析网页html的方法
2015/07/09 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
利用谷歌地图API获取点与点的距离的js代码
2012/10/11 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
jquery ajax修改全局变量示例代码
2013/11/08 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
javascript数据结构之双链表插入排序实例详解
2015/11/25 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
Jquery实现的简单轮播效果【附实例】
2016/04/19 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
2017/02/15 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
2017/07/19 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
[04:44]DOTA2西游记战队视频彩蛋流出 师徒开黑巧遇林书豪
2016/08/03 DOTA
pandas的object对象转时间对象的方法
2018/04/11 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
django admin 自定义替换change页面模板的方法
2019/08/23 Python
python的pip有什么用
2020/06/17 Python
如何基于Django实现上下文章跳转
2020/09/16 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
什么是继承
2013/12/07 面试题
十佳文明家庭事迹
2014/05/25 职场文书
银行培训心得体会范文
2016/01/09 职场文书