博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python奇遇记:数据结构窥探3
阅读量:7237 次
发布时间:2019-06-29

本文共 1968 字,大约阅读时间需要 6 分钟。

这次主要说说字典和集合这两种数据类型。

字典和集合都是基于散列表实现的,散列表也就是hash表,了解过数据结构的应该知道。与散列表相关的一个概念叫做可散列,什么是可散列?在python官方定义中是这样说的:如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现__hash__()方法。

python中,原子不可变类型(str、bytes和数值类型)都是可散列类型,同时所有的不可变类型也是可散列的。

集合

什么是集合?在数学中指的是具有某种特定性质的事物的总体,在python中集合指许多唯一对象的聚集。注意这个唯一,也就是说集合中不允许重复值出现,所以集合可以用来去重。

在python中,用大括号括起来表示一个集合。

data = [11, 11, 2, 3, 4, 4, 5, 4, 6]set(data)
{2, 3, 4, 5, 6, 11}

将列表类型的data转换为集合类型后,重复值被去掉了。

在数学中,集合可以求并集、交集、差集等,python也可以做同样的事。比如:

data1 = {1, 2, 3, 4, 5}data2 = {3, 4, 5, 6, 7}# 交集print(data1 & data2)# 差集print(data1 - data2)# 并集print(data1 | data2)
{3, 4, 5}{1, 2}{1, 2, 3, 4, 5, 6, 7}

上面说过,集合类型用大括号表示,如果我需要创建一个空集合,是不是用{ }表示就行了?问题来了,空集合用{ }表示,空字典也用{ }表示,这肯定不行。python中,创建一个空集合使用set()生成,{ }只会创建一个空的字典。

还有一个要提到的是集合推导。和列表推导、字典推导类似,这里就不讲了。

字典

字典中有几个方法需要说一下,看个例子。

a = {'x': 1, 'y': 2, 'z': 3}# a.keys()返回所有键的集合,a.items()返回键值对集合,a.values返回值集合# 可对字典进行集合运算,比较大小等运算b = {'w' : 10,'x' : 11,'y' : 2}# 直接进行集合操作,a.values()不可以print(a.keys() & b.keys())print(a.items() & b.items())print(a.keys() - b.keys())
{'x', 'y'}{('y', 2)}{'z'}

在字典中,可以使用a.keys()返回所有键的集合,a.items()返回键值对集合,a.values返回值集合,既然返回的是集合,就可以使用上面集合中说到的运算,大大简化操作。

在查找字典中的某个键时,如果键不存在就会报错,影响程序运行,为了避免不必要的麻烦,我们可以使用d.get(k, default),给找不到的键一个默认值。使用get的问题是,它不太符合python的哲学,d[k]比d.get(k)更加直观和简洁。

其实我们还可以这样,使用setdefault(k, default)来指定一个默认值,这个方法比get方法更高效,但是我们需要指定特殊的键。而使用另一种办法defaultdict(),任何键在找不到的情况下都会用defaultdict()中的值(数据类型比如list、str)替换。

d = {1: 'a', 2: 'b', 3: 'c'}d.get(4, 'd')import collectionsfrom collections import defaultdictd.setdefault(4, 'd')d[4]# 如果查询5找不到,还要指定默认值# 找不到的话用空字符串替换d = defaultdict(str)d[5]
''

第二个要说的是OrderedDict,它可以保持字典中的顺序,插入时是什么样就是什么样,不会改变。在设计API时就可以使用OrderDict创建你的数据接口。

怎么合并两个或者多个字典?使用ChainMap,接受字典作为参数,如果参数中某个键重复了,ChainMap会返回第一个字典中的值,这个方法也是放在collections模块下。

a = {'x': 1, 'z': 3 }b = {'y': 2, 'z': 4 }from collections import ChainMapc = ChainMap(a,b)print(c['x'])print(c['y'])# 只会返回第一个参数a中的zprint(c['z'])
123

本人才疏学浅,上文中难免有些错误,还请各位品评指正。如果觉得写的还行,欢迎关注我的公众号MLGroup,带你走进机器学习的世界。

图片描述

转载地址:http://txgfm.baihongyu.com/

你可能感兴趣的文章
HTTP状态码详解
查看>>
MFC多线程
查看>>
jk记录在这儿
查看>>
RHEL5.3跑MYSQL5.5时出现系统崩溃
查看>>
windows2008密码遗忘的补救
查看>>
Java中的XML操作
查看>>
lvs负载均衡实践之lvs-nat
查看>>
apache2.4 + php7.2 + mysql 配置指南2018版
查看>>
Codeigniter:如何写一个好的Model
查看>>
神经网络之父Hinton回加拿大办AI研究所,和美国大公司抢人才
查看>>
Linux 基金会董事 Jim Zemlin:全球开源可持续增长将带来更多价值
查看>>
说说WordPress的主查询函数-query_posts()
查看>>
认识Linux中的LVM PV VG LV
查看>>
SEO如何写好文章标题
查看>>
剖析产品 找准用户 做个创业“老炮儿” --司马亮创业回忆录(二)
查看>>
How GoldenGate process consumes memory
查看>>
zabbix触发器无法执行动作
查看>>
openstack 之 控制节点物理机备份
查看>>
安装docker-compose的两种方式
查看>>
CentOS7.3编译安装MariaDB10.2.12
查看>>