sortedcontainers库简介
sortedcontainers
是一个 Python 第三方库,提供了高效的排序数据结构,包括 SortedList
、SortedDict
和 SortedSet
。这些数据结构在底层实现上进行了优化,使得它们在排序操作方面比 Python 内置的数据结构更加高效。
sortedcontainers 库的特点和优点:
高效:sortedcontainers 库中的实现基于纯 Python,但性能与 C 扩展相当。它们在排序操作方面比 Python 内置的数据结构(如 list、dict 和 set)更加高效。
易用:这个库提供了与 Python 内置数据结构类似的 API,使得开发者能够轻松地使用这些高效的排序数据结构。
灵活:sortedcontainers 库提供了 SortedList、SortedDict 和 SortedSet 三种有序数据结构,可以满足各种排序和查找需求。
纯 Python 实现:这个库完全用 Python 编写,无需安装 C 编译器或预构建和分发自定义 C 扩展。
良好的文档和社区支持:sortedcontainers 库有详细的文档和示例,以及活跃的社区支持,方便开发者学习和使用。
类似的库有:
blist:blist 是一个高性能的双向链表和有序字典实现,它提供了与 Python 内置 list 和 dict 类似的 API。blist 使用 C 扩展实现,因此在性能上可能比 sortedcontainers 更高,但它需要安装 C 编译器并构建 C 扩展。
bintrees:bintrees 是一个二叉树和红黑树的 Python 实现,提供了有序字典、有序集合和有序列表等数据结构。bintrees 同样使用 C 扩展实现,性能较好,但需要安装 C 编译器并构建 C 扩展。
sortedcontainers 库的一个显著优势是其纯 Python 实现,这使得它在部署和使用上更加简单。然而,如果性能是首要考虑因素,那么可以考虑使用 blist 或 bintrees 这样的库,它们使用 C 扩展实现,可能在某些情况下性能更优。在选择库时,需要根据项目需求和性能要求进行权衡。
下面我们分别介绍sortedcontainers库三个常见类及其方法。
1. SortedList:
SortedList
是一个有序列表,它维护了元素的顺序并允许快速插入、删除和查找操作。
主要方法:
append(x)
: 在列表末尾添加元素 x。extend(iterable)
: 将 iterable 中的元素添加到列表末尾。insert(i, x)
: 在指定索引 i 处插入元素 x。pop(i=None)
: 删除并返回指定索引 i 处的元素(默认为末尾元素)。remove(value)
: 删除列表中第一个值为 value 的元素。index(value)
: 返回列表中第一个值为 value 的元素的索引。count(value)
: 返回列表中值为 value 的元素的数量。search(x)
: 返回 x 在列表中的排名(排名从 0 开始)。bisect_left(x)
: 返回应该插入 x 以保持列表有序的索引。bisect_right(x)
: 返回搜索 x 的插入点,以便在插入 x 后仍然保持有序。
2. SortedDict:
SortedDict
是一个有序字典,它将键按顺序存储,并允许快速查找、插入和删除操作。
主要方法:
__getitem__(key)
: 返回指定键的值。__getitemslice__(start, stop)
: 返回一个包含指定范围内键值对的新的 SortedDict。__setitem__(key, value)
: 设置指定键的值。__delitem__(key)
: 删除指定键及其对应的值。popitem(last=True)
: 删除并返回最后一个(或第一个,如果 last 为 False)键值对。pop(key, default=None)
: 删除并返回指定键的值,如果键不存在,则返回默认值(或触发 KeyError)。get(key, default=None)
: 返回指定键的值,如果键不存在,则返回默认值。items()
: 返回一个包含字典中所有键值对的视图。keys()
: 返回字典中所有键的视图。values()
: 返回字典中所有值的视图。iteritems()
: 迭代字典中的键值对。iterkeys()
: 迭代字典中的键。itervalues()
: 迭代字典中的值。
3. SortedSet:
SortedSet
是一个有序集合,它维护了元素的唯一性并允许快速插入、删除和查找操作。
主要方法:
add(x)
: 将元素 x 添加到集合中。update(iterable)
: 从 iterable 中添加元素到集合中。remove(x)
: 删除集合中第一个值为 x 的元素。discard(x)
: 删除集合中元素 x,如果 x 不存在,则不执行任何操作。pop()
: 删除并返回集合中的一个随机元素。clear()
: 移除集合中的所有元素。intersection(iterable)
: 返回集合与 iterable 的交集。union(iterable)
: 返回集合与 iterable 的并集。difference(iterable)
: 返回集合与 iterable 的差集。symmetric_difference(iterable)
: 返回集合与 iterable 的对称差集。intersection_update(iterable)
: 从集合中保留与 iterable 相交的元素。union_update(iterable)
: 将 iterable 中的元素添加到集合中。difference_update(iterable)
: 从集合中删除 iterable 中的元素。symmetric_difference_update(iterable)
: 从集合中删除与 iterable 相同的元素,并将 iterable 中的其余元素添加到集合中。issubset(iterable)
: 如果集合是 iterable 的子集,则返回 True,否则返回 False。issuperset(iterable)
: 如果集合包含 iterable 中的所有元素,则返回 True,否则返回 False。subset(iterable)
: 如果集合是 iterable 的子集,则返回 True,否则返回 False。superset(iterable)
: 如果集合包含 iterable 中的所有元素,则返回 True,否则返回 False。
这些类和方法使得 sortedcontainers
库在处理有序数据结构时非常高效,适用于各种排序和查找需求。
常见场景的使用案例
下面是一些使用 sortedcontainers
库中常用功能的示例代码:
1. 使用 SortedList
进行排序和查找操作:
from sortedcontainers import SortedList
sorted_list = SortedList()
sorted_list.append(3)
sorted_list.append(1)
sorted_list.append(4)
print(sorted_list) # 输出:SortedList([1, 3, 4])
sorted_list.extend([2, 5, 6])
print(sorted_list) # 输出:SortedList([1, 2, 3, 4, 5, 6])
sorted_list.remove(3)
print(sorted_list) # 输出:SortedList([1, 2, 4, 5, 6])
index = sorted_list.index(4)
print(index) # 输出:3
count = sorted_list.count(2)
print(count) # 输出:1
2. 使用 SortedDict
进行排序和查找操作:
from sortedcontainers import SortedDict
sorted_dict = SortedDict()
sorted_dict['a'] = 1
sorted_dict['b'] = 2
sorted_dict['c'] = 3
print(sorted_dict) # 输出:SortedDict([('a', 1), ('b', 2), ('c', 3)])
sorted_dict['b'] = 4
print(sorted_dict) # 输出:SortedDict([('a', 1), ('b', 4), ('c', 3)])
item = sorted_dict.popitem()
print(item) # 输出:('c', 3)
keys = sorted_dict.keys()
print(list(keys)) # 输出:['a', 'b']
values = sorted_dict.values()
print(list(values)) # 输出:[1, 4]
3. 使用 SortedSet
进行排序和查找操作:
from sortedcontainers import SortedSet
sorted_set = SortedSet()
sorted_set.add(3)
sorted_set.add(1)
sorted_set.add(4)
print(sorted_set) # 输出:SortedSet([1, 3, 4])
sorted_set.add(2)
print(sorted_set) # 输出:SortedSet([1, 2, 3, 4])
sorted_set.discard(5)
print(sorted_set) # 输出:SortedSet([1, 2, 3, 4])
intersection = sorted_set.intersection([1, 2, 3])
print(intersection) # 输出:SortedSet([1, 2, 3])
union = sorted_set.union([5, 6])
print(union) # 输出:SortedSet([1, 2, 3, 4, 5, 6])
这些示例展示了如何使用 sortedcontainers
库中的 SortedList
、SortedDict
和 SortedSet
类进行排序和查找操作。这些数据结构在处理有序数据时非常高效,适用于各种排序和查找需求。
参考文章
【精选】Python [sortedcontainers]有序容器库使用不完全…
一个基于序列的弱监督视觉信息抽取学习框架 - 知乎
序列比对(二十一)——中间字符串问题的算法及实现代码 - …
Python有哪些经典的常用库? - 知乎
sortedcontainers模块入门介绍-Python笔记