1. 简介
Python相比其他编程语言在数据结构操作上,更加灵活和便捷,这离不开Python的collections模块。collections模块是Python标准库中提供的用于扩展Python自带数据类型提供额外功能的模块,可以用来实现各种高级数据结构。
2. 常用高级数据结构
2.1 哈希表:defaultdict
哈希表(Hash Table)是一种以键(Key)和值(Value)的形式进行存储的数据结构,它通过哈希函数将所需查找的数据映射到表中一个位置来访问记录,因此能够实现快速的插入、删除和查找操作。
Python内置了字典数据类型,但有时候需要在代码中使用默认值(Default Value)来避免抛出KeyError异常。这时,collections模块中的defaultdict类可以帮助我们实现这个目的。
from collections import defaultdict
# 定义普通字典
d = {}
# 对不存在的key赋值报错
try:
d['a'] += 1
except KeyError as e:
print(e)
# 定义使用defaultdict的字典
dd = defaultdict(int) # 注意这里是int而不是int()
# 自动设置默认值0
dd['a'] += 1
print(dd) # defaultdict(, {'a': 1})
2.2 链表:deque
链表(Linked List)是一种具有节点(Node)组成的线性数据结构,每个节点都包含数据以及指向下一个节点的指针(Pointer)。Python标准库中的list类型实现了对数组的支持,但对于插入、删除等操作,时常需要遍历整个列表,导致效率低下。因此,Python中还提供了一个双向队列(Double Ended Queue,简称deque)类型,它是由一系列节点来组成,每个节点都存储着相邻节点的地址,因此在插入、删除等操作上比普通list要快得多。
from collections import deque
# 创建队列
q = deque([1, 2, 3])
print(q) # deque([1, 2, 3])
# 从右边插入元素
q.append(4)
print(q) # deque([1, 2, 3, 4])
# 从左边插入元素
q.appendleft(0)
print(q) # deque([0, 1, 2, 3, 4])
# 弹出右侧元素
q.pop()
print(q) # deque([0, 1, 2, 3])
# 弹出左侧元素
q.popleft()
print(q) # deque([1, 2, 3])
2.3 集合:Counter
集合(Set)是Python中一组无序且不重复的元素的数据结构。它可以用来去除列表中的重复元素,还可以进行并集、交集、差集等集合操作。Counter是一种特殊的集合,它是对一个列表中各个元素出现次数的计数器。
from collections import Counter
lst = ['a', 'b', 'c', 'd', 'a', 'b', 'b']
# 使用Counter对列表中的元素进行计数
c = Counter(lst)
print(c) # Counter({'b': 3, 'a': 2, 'c': 1, 'd': 1})
# 获取计数器中元素出现次数最多的前N个元素以及对应的次数
print(c.most_common(2)) # [('b', 3), ('a', 2)]
2.4 堆:heapq
堆(Heap)是一种特殊的树形数据结构,它满足以下两个条件:
堆中所有非叶子节点的值都大于或等于(小于或等于)它的子节点。
堆总是一棵完全二叉树。
Python标准库中提供了heapq模块,它实现了堆的所有操作,包括插入、删除、查找最大或最小值。
import heapq
lst = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
# 使用heapq将列表转化为堆
heapq.heapify(lst)
print(lst) # [1, 1, 2, 3, 3, 9, 4, 6, 5, 5, 5]
# 弹出堆中最小的元素
print(heapq.heappop(lst)) # 1
# 向堆中插入元素
heapq.heappush(lst, 0)
print(lst) # [0, 1, 2, 3, 3, 9, 4, 6, 5, 5, 5]
3. 总结
在Python的数据结构操作中,collections模块可以说是最常用的模块,其中的各种数据类型能够轻松地在Python代码里扩展了许多有用的新特性。我们可以通过自己的代码实践进行更多的探索,发现这些功能的强大和便捷。