python 字典
python中的字典往往也被叫做映射类型,散列表、查找表,或者是关联数组
字典也是python的核心数据类型,python中的所有对象都是使用字典来存储的
字典表达式可以简单的构建字典对象
python中的字典的键应该是可以hash的类型来进行索引。
也就是字典中的对象使用键计算得到的hash值来标记,一般的话python的字典对象查找删除插入更新和删除操作都是时间复杂度为 o(1)
另外也有一些第三方实现的字典,例如跳跃表和B树字典
defaultdict 会为缺失键,创建一个键对应的对象,而不是报错
一般创建一个数据类型存储的时候
list,set 都是比较常见的
可以使用collections.ChainMap()来对多个字典进行搜索
可以使用collections.MappingProxyType 来创建只读字典
python 在自定义对象类里面实现一些dunder方法的时候,要注意尽量避免通过对这种方法隐式调用的方式来实现,因为会造成异常情况下的无限递归。
集合模块里面的OrderedDict
ChainMap(*maps)可以快速连接多个映射容器,如果没有提供映射的情况,就会提供一个空字典,转为连接映射之后,可以看做是在内存之上建立了一个更加高级的映射空间,将多个独立的映射空间。
但是这种映射链接在查找的时候会按照顺序来搜查,然后会返回第一个结果。
UserDict这个类是使用pure python实现的字典,适合继承之后用来实现自定义
无序的集合
因为集合是一个可变的无序的映射类型,所以对集合的增删改查
集合特有操作:
.difference(集合) 差集 -
.intersection(集合) 交集 |
.union(集合) 并集 &
^ 对称差集 也就是 并集减去交集
.add()
.update
.remove(元素) 元素不存在与集合中会报错
.discard(元素) 元素不在也能做好删除操作
s.isdisjoint(z)看看集合s和z是否相交
s<=z s是否是z的子集
s<z 的真子集
s.pop() 移除一个元素然后返回它的值
不可变的映射类型容器
from types import MappingProxyType
di = dict()
d_proxy = MappingProxyType(di)
# 对原始映射做了只读封装,可以反映原始映射的变动
# 但是对只读视图的修改不能修改原始映射
# 况且MappingProxyType 不支持对映射元素修改
不可变的集合 frozenset()能够创建不可变集合
集合的创建 使用字面量 {1,2,3} 要比set([1,2,3])更快一点
同样的还有列表,在元素比较少的时候短数据类型可以使用字面量来创建
字典在检索效率上很好,但是用于海量数据存储的时候,字典因为使用散列表的原因会占用大量内存,这时候使用也元组或者具名元组是一种更好的选择。
字典在判断是否相等的时候,映射元素的顺序是不用考虑的,因为存在散列冲突问题。
所以时间和内存上必须做出取舍
另外一点队列和元组一般是最省内存的数据类型。