集合(set)
- set集合 可变容器
- set 不记录元素的添加顺序, 无序
- set元素不允许重复, 应用场景去重
- set 方法索引
- 支持运算符
-
<=
issubset()
左侧是否为右侧set对象子集 -
>=
issuperset()
范围比较 -
difference()
对集合做减法, 不改变c集合本身
-
c.difference_update(books)
用c集合减去books集合里的元素,改变c集合本身
-
s.clear()
删除c集合里的所有元素 set1 & set2
set1.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
的方法基本都有两个版本,这就体现了它作为双端队列的特征 -
append
和appendleft
:在deque
的右边或左边添加元素,也就是默认在队列尾添加元素 -
pop
和popleft
:在deque
的右边或左边弹出元素,也就是默认在队列尾弹出元素 -
extend
和extendleft
在deque
的右边或左边添加多个元素,也就是默认在队列尾添加多个元素 -
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 对移动到最右边(最后加入)
- 小结
- 两端弹出, 左右移动