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() 移除一个元素然后返回它的值

不可变的映射类型容器


  1. from types import MappingProxyType
  2. di = dict()
  3. d_proxy = MappingProxyType(di)
  4. # 对原始映射做了只读封装,可以反映原始映射的变动
  5. # 但是对只读视图的修改不能修改原始映射
  6. # 况且MappingProxyType 不支持对映射元素修改

不可变的集合 frozenset()能够创建不可变集合

集合的创建 使用字面量 {1,2,3} 要比set([1,2,3])更快一点
同样的还有列表,在元素比较少的时候短数据类型可以使用字面量来创建

字典在检索效率上很好,但是用于海量数据存储的时候,字典因为使用散列表的原因会占用大量内存,这时候使用也元组或者具名元组是一种更好的选择。

字典在判断是否相等的时候,映射元素的顺序是不用考虑的,因为存在散列冲突问题。

所以时间和内存上必须做出取舍

另外一点队列和元组一般是最省内存的数据类型。