sortedcontainers库 常见的方法和功能

sortedcontainers库简介

sortedcontainers 是一个 Python 第三方库,提供了高效的排序数据结构,包括 SortedListSortedDictSortedSet。这些数据结构在底层实现上进行了优化,使得它们在排序操作方面比 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 库中的 SortedListSortedDictSortedSet 类进行排序和查找操作。这些数据结构在处理有序数据时非常高效,适用于各种排序和查找需求。

参考文章

【精选】Python [sortedcontainers]有序容器库使用不完全…
一个基于序列的弱监督视觉信息抽取学习框架 - 知乎
序列比对(二十一)——中间字符串问题的算法及实现代码 - …
Python有哪些经典的常用库? - 知乎
sortedcontainers模块入门介绍-Python笔记

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值