python 序列 字典
序列类型
python 是基于协议的,只要实现了相应方法就是相应的类型。(类似golang的interface)
- 容器序列 list tuple deque
其中可放任意类型 - 扁平序列 str bytes bytearray array.array
内容类型相同 - 可变序列 list deque bytearray array
- 不可变 str tuple bytes
序列 abc 继承
collections.abc
中 Sequence、MutableSequence(基于前者) 为 可变序列、不可变序列
可通过查看原文件确认实现这些类型需要实现哪些协议
实现可切片对象
Sequence需要实现 __getitiem__
MutableSequence需要实现 __setitiem__
__delitiem__
__insert__
class Group(object):
def __init__(self, *args):
pass
def __getitiem__(self, index):
pass
def __len__(self):
pass
# Group 就可以当序列使用
bisect
用来处理已排序的序列,维持排序,升序
使用二分查找
ls = []
bisect.insort(ls, 2)
bisect.insort(ls, 4)
bisect.insort(ls, 3)
bisect.insort(ls, 1)
bisect.insort(ls, 5)
# 插入时时刻维持排序
bisect.bisect(ls, 3) # 输出该插入的位置
字典、集合类型
实现collections.abc
下的MutableMaping
即为字典类
不能继承重写list dict等用c语言实现的类型
如果要继承字典类,则继承collections.UserDict
collections.defaultDict
中给字典一个默认值
my_dict = defaultdict(None)
val = my_dict["key"] # 获得None而不是keyError
set fronzenset
set 内部无序
fronzenset 为不可变值,可以作为dict的键
dict、set的查找时间远远低于list
随着数据量的增大,list查找消耗的时间也增大。但dict不会。
实现原理为哈希表。创建dict时申请的是连续空间。
一个实现了__hash__
的类就是可哈希对象
dict内存花销大,因为哈希表内部有空闲单元。自定义对象或python内部对象都是用dict包装的