第3.5章 数据结构与算法——CookBook笔记
序列分解为单个变量:解包
可迭代对象就可以执行分解
字符串,文件,迭代器,生成器
_丢弃值
分解值过多(未知):*表达式
*用于迭代变长元组序列
保存最后n个元素:
保存有限历史记录
collections.deque
编写搜索某项记录的代码,用yield生成器函数
处理搜索的代码与使用搜索结果的代码 解耦合
指定长度deque:自动移除最老的记录
无限队列:双端
找到最大最小n个元素
heapq
nlargest nsmallest
可接受参数'key',对付更复杂的数据结构
随着n变大
min,max
nlargest nsmallest
sort 切片
实现优先队列
heapq:引入额外的索引
一键多值字典:
值:列表,集合
defaultdict(list/set)
自己模拟,会有混乱代码
检测键是否存在
值初始化为空列表
append
字典保存有序
OrderedDict 保持元素添加序
双向链表,两倍空间
字典有关的计算问题
构建(value,key)相反元组
zip打包
传递给min max sorted
zip创建的是迭代器
#迭代器:遍历的提前结束
字典默认操作是基于key的
复合语义:寻找值,与其对应的key
打包比较,返回的是两个关键字的比较结果
两个字典寻找相同点
keys items
集合运算
可用于过滤键
value不满足集合定义,需先转换为集合
移除序列重复项,保持顺序不变
值可哈希
集合+生成器
不可哈希:序列
指定hash函数key
可哈希对象:生存期内不可变,有一个__hash__方法:整数,浮点数,字符串,元组
不可哈希列表可不可以直接调用set?指定key?
对切片命名
避免硬编码索引
slice()切片对象
属性:start,stop,step
indices(size)
切片映射到特定大小的序列,返回(start,stop,step)
保持步长,自动生成边界??
序列中出现次数最多的元素
collections模块 counter类(传入可哈希对象)
most_common()方法
手动增加计数 update
重载了+-
通过公共关键字对字典列表排序
operator函数 itemgetter函数
提取关键字
sorted关键字参数key,表示可调用对象,返回排序依据的值
不原生支持比较
lamda u:u.id
operator.attrgetter快,允许提取多个值
根据字段将记录分组
itertools.groupby,返回值与一个迭代器
扫描出序列中的相同值的序列项
需要事先排序
分组,随机访问:多值字典
defaultdict
筛选序列中元素
[列表推导式]
(生成器表达式)
filter:返回迭代器
替换值:条件表达式
compress,布尔元素迭代器
从字典提取子集
字典推导式,效率
名称映射到序列中元素
命名元组
collections.namedtuple
将代码与控制的元素解耦
相对于字典:空间效率
_replace修改属性,创建并返回全新元组
高效,支持修改属性:__slots__属性的类
数据转换+换算
生成器表达式
生成器表达式作为函数的唯一参数,不必重复使用括号
不需要临时列表,内存优化
合并多个映射
collections模块ChainMap类
维护映射关系的列表
引用模型
new_child
字典update
值模型