python奇遇记:数据结构窥探3

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

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

python中,原子不可变类型(str、bytes和数值类型)都是可散列类型,同时全部的不可变类型也是可散列的。机器学习

集合

什么是集合?在数学中指的是具备某种特定性质的事物的整体,在python中集合指许多惟一对象的汇集。注意这个惟一,也就是说集合中不容许重复值出现,因此集合能够用来去重。学习

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

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

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

在数学中,集合能够求并集、交集、差集等,python也能够作一样的事。好比:code

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 collections
from collections import defaultdict

d.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 ChainMap
c = ChainMap(a,b)
print(c['x'])
print(c['y'])
# 只会返回第一个参数a中的z
print(c['z'])
1
2
3

本人才疏学浅,上文中不免有些错误,还请各位品评指正。若是以为写的还行,欢迎关注个人公众号MLGroup,带你走进机器学习的世界。
图片描述

相关文章
相关标签/搜索