集合(set)

  • set集合 可变容器
  • set 不记录元素的添加顺序, 无序
  • set元素不允许重复, 应用场景去重
  • set 方法索引
  • 支持运算符
  • <= issubset() 左侧是否为右侧set对象子集
  • >= issuperset() 范围比较
  • -difference() 对集合做减法, 不改变c集合本身
  • c.difference_update(books) 用c集合减去books集合里的元素,改变c集合本身
  • s.clear() 删除c集合里的所有元素
  • set1 & set2set1.intersection(set2) 计算两个集合的交集,不改变set1集合本身
  • d.intersection_update(books) 计算两个集合的交集,改变d集合本身
  • set(rang(5)) 将range对象包装成set集合
  • xor = e ^ f 对两个集合执行异或运算
  • e.union(f) 计算两个集合的并集,不改变e集合本身
  • e.update(f) 计算两个集合的并集,改变e集合本身
  • frozenset 集合 set 的不可变版本
  • 应用场景 dict 的 key 必须是不可变对象
  • 当集合元素不需要改变时,使用 frozenset 代替 set 更安全
  • 当某些 API 需要不可变对象时,必须用 frozenset 代替set

collections.deque(双端队列)

  • 数据结构
  • 栈、队列、双端队列
  • 栈 (只允许一端操作)
  • 栈是一种特殊的线性表,它只允许在一端进行插入、删除操作, 栈是一种后进先出(LIFO)的线性表
  • 允许(插入/删除)操作端称之为栈顶,另一端则被称为栈底, 插入push(入栈) 删除pop(出栈)
  • 队列(允许两端操作, 一出一进)
  • 只允许在线性表的前端(front)进行删除操作,在表的后端(rear)进行插入操作
  • 进行删除操作的端被称为队头,进行插入操作的端被称为队尾, 队列是一种先进先出(FIFO)的线性表
  • 双端队列 deque
  • 它可以在两端同时进行插入、删除操作,故双端队列可成栈或队列
  • collections.deque
  • deque 的方法基本都有两个版本,这就体现了它作为双端队列的特征
  • appendappendleft :在 deque 的右边或左边添加元素,也就是默认在队列尾添加元素
  • poppopleft :在 deque 的右边或左边弹出元素,也就是默认在队列尾弹出元素
  • extendextendleftdeque 的右边或左边添加多个元素,也就是默认在队列尾添加多个元素
  • clear() 方法用于清空队列, insert() 方法则是线性表的方法,用于在指定位置插入元素
  • rotate() 方法 作用是将队列的队尾元素移动到队头,使之首尾相连, 俗称 循环队列
  • collections 模块
  • 内置通用数据类型容器
  • namedtuple dequue Counter OrderedDict defaultdict UserDict UerList UserString

堆操作(heapq)

  • 堆概念
  • 将数据顺序排成一棵完全二叉树
  • 小顶堆(Python 提供基于小顶堆的操作)
  • 假设有 n 个数据元素的序列 k0,k1,…,kn-1,
  • 当且仅当满足 ki≤k2i+1 且 ki≤k2i+2(其中 i=0,2,…,(n-1)/2)时,可以将这组数据称为小顶堆(小根堆)
  • 即标准 父节点值小于子节点值,否则进行替换, 二叉树遍历顺序 从上到下,从左右,根后子
  • 操作
  • Python 并没有提供“堆”这种数据类型,它是直接把列表当成堆处理的
  • heapq 包中有一些函数,当程序用这些函数来操作列表时,该列表就会表现出“堆”的行为
  • heapq (类堆队列,操作工具函数)
  • heappush(heap, item):将 item 元素加入堆
  • heapify(heap):将堆属性应用到列表上,完全二叉树
  • heapreplace(heap, x):将堆中最小元素弹出,并将元素x 入堆
  • merge(*iterables, key=None, reverse=False) 将多个有序的堆合并成一个大的有序堆,然后再输出
  • heappushpop(heap, item) 将item 入堆,然后弹出并返回堆中最小的元素
  • nlargest(n, iterable, key=None) 返回堆中最大的 n 个元素
  • nsmallest(n, iterable, key=None) 返回堆中最小的 n 个元素
  • 小结
  • heapq 包中提供的函数,其实就是提供对排序算法中“堆排序”的支持
  • Python 通过在底层构建小顶堆,从而对容器中的元素进行排序,以便程序能快速地获取最小、最大的元素

collections.ChainMap类 配置覆盖

  • 目的
  • 使用链的方式将多个 dict“链”在一起
  • 从而允许程序可直接获取任意一个 dict 所包含的 key 对应的 value
  • 关键
  • 由于 ChainMap 只是将多个 dict 链在一起,并未真正合并它们,因此在多个 dict 中完全可能具有重复的 key
  • 在这种情况下,排在“链”前面的 dict 中的 key 具有更高的优先级
  • 场景
  • 由于ChainMap 有同名先出现优先级高,达到链域查找的效果
  • 配置信息覆盖
  • ChainMap(command_line_args, os.environ, defaults) command_line_args优先级最高

collections.Counter类

  • 概述
  • 自动统计容器中各元素出现的次数
  • Counter 的本质就是一个特殊的 dict, key 都是其所包含的元素,而它的 value 则记录了该 key 出现的次数
  • 使用
  • 以可迭代对象作为参数创建Counter对象,如字符串,列表,元组等
  • collections.Counter 继承了 dict 类,并有所扩展
  • elements() 该方法返回该 Counter 所包含的全部元素组成的迭代器
  • most_common([n]) 该方法返回 Counter 中出现最多的 n 个元素,通常用于排行统计之类
  • subtract([iterable-or-mapping]) 该方法计算 Counter 的减法,其实就是计算减去之后各元素出现的次数

collections.defaultdict类

  • 概述
  • 程序试图根据不存在的 key 采访问 dict 中对应的 value,则会引发 KeyError 异常
  • defaultdict 则可以提供一个 default_factory 属性,该属性所指定的函数负责为不存在的 key 来生成 value
  • 原理
  • 当使用__getitem__ 协议时,如果key错误不存在,则会 调用 __missing__(key),而它会调用 default_factory
  • 应用场景
  • defaultdict 中不存在的 key 设置默认的 value
  • 达到容器元素收集的效果,更方便

collections.namedtuple

  • namedtuple() 使用该工厂函数可以创建一个 tuple 类的子类本质是生产类的元编程
  • namedtuple(typename, field_names, *, verbose=False, rename=False, module=None)
  • typename :该参数指定所创建的 tuple 子类的类名
  • field_names 该参数是一个字符串序列, 使用单字符串时代表所有字段名,多字段用逗号或空格隔开
  • rename:如果将该参数设为 True,那么无效的字段名将会被自动替换为位置名
  • 应用场景
  • 通常用来创建命名元组类, 它的实例对象则是元组
  • 从本质上讲,类是属于模板代码级别,即生产实例对象的代码
  • 常用来创建,比如坐标
  • 命名元组类方法
  • _make(iterable) 类方法 该方法用于根据序列或可迭代对象创建命名元组对象
  • _asdict() 将当前命名元组对象转换为 OrderedDict 字典
  • _replace(**kwargs) 替换命名元组中一个或多个字段的值
  • _source 该属性返回定义该命名元组的源代码
  • _fields 该属性返回该命名元组中所有字段名组成的元组

collections.OrderedDict类

  • OrderedDict 能维护 key-value 对的添加顺序,即它有序
  • 即使两个 OrderedDict 中的 key-value 对完全相同,但只要它们的顺序不同,程序判断依然为 False
  • 有序 OrderDict方法
  • popitem(last=True) 默认弹出并返回最右边(最后加入)的 key-value 对
  • move_to_end(key, last=True) 默认将指定的 key-value 对移动到最右边(最后加入)
  • 小结
  • 两端弹出, 左右移动