Pythonz中 SortedList的用法

文章目录

      • 安装 sortedcontainers 库
      • SortedList 基本用法
      • 特性与操作
      • 更多操作
      • 性能考虑
      • 实例:范围查询与交集
      • 高级特性与最佳实践
        • 自定义比较函数
        • 并行处理与多线程
        • 性能调优
        • 与其他数据结构结合使用
    • 应用案例
        • 1. 金融交易记录分析
        • 2. 日志文件管理
        • 3. 学生成绩管理系统
        • 4. 实时数据分析
        • 5. 社交媒体热门话题追踪

Python 的 SortedList 是一个高效的数据结构,它来自于第三方库 sortedcontainers,这个库提供了有序的容器,包括 SortedList, SortedDict, 和 SortedSet。这些容器在内部维持着元素的排序状态,使得查询、插入和删除等操作具有很好的性能。

安装 sortedcontainers 库

首先,你需要安装 sortedcontainers 库,可以通过 pip 完成:

pip install sortedcontainers

SortedList 基本用法

一旦安装了 sortedcontainers,你就可以这样使用 SortedList

from sortedcontainers import SortedList

# 初始化一个空的 SortedList
sl = SortedList()

# 向 SortedList 中添加元素
sl.add(5)
sl.add(3)
sl.add(6)

# 打印 SortedList
print(sl)  # 输出可能是 [3, 5, 6]

# 添加一个可迭代对象
sl.update([1, 4, 2])

# 查找元素
print(3 in sl)  # 输出 True

# 访问元素
print(sl[1])  # 输出 4,因为索引是从0开始的

# 删除元素
sl.discard(5)

# 获取长度
print(len(sl))  # 输出当前元素数量

# 迭代
for value in sl:
    print(value)

# 获取切片
slice_of_sl = sl[1:3]
print(slice_of_sl)  # 输出切片的视图,比如 [4, 6]

特性与操作

  • 排序: SortedList 在添加元素时会自动排序,保持元素的有序状态。
  • 查找: 由于元素有序,查找操作(包括 in 操作符)非常高效。
  • 时间复杂度: 添加(add)操作的时间复杂度大约为 O(log n),其中 n 是列表中的元素数量。
  • 更新: update 方法可以一次性添加多个元素并排序,时间复杂度取决于添加元素的数量。
  • 删除: 使用 discard, remove, 或 pop 方法可以删除元素。
  • 切片: 支持切片操作,返回的是一个新的视图,而不是列表的副本。
  • 迭代: 可以直接迭代遍历 SortedList

SortedList 是一个强大的工具,特别适合于那些需要频繁查询且数据需要保持有序的场景。

当然,sortedlist 还有更多的高级功能和方法,让我们深入了解一下:

更多操作

  • 二分查找: 虽然直接通过索引访问或使用 in 操作已经很快,但 SortedList 还提供了更详细的查找方法,如 bisect_left, bisect_right, 和 index

    • bisect_left(value):返回 value 可以插入并保持列表有序的位置的索引。
    • bisect_right(value):类似于 bisect_left,但对于已存在于列表中的值,返回其右侧的下一个位置。
    • index(value[, start[, stop]]):返回 value 的索引,类似于列表的 index 方法,但可选地限制在 [start, stop) 范围内搜索。
  • 反向迭代: 使用 reversed() 函数或 [::-1] 切片可以反向遍历 SortedList

  • 统计元素: count(value) 方法可以统计列表中某个值出现的次数。

  • 清空列表: 使用 clear() 方法可以清空 SortedList

  • 从迭代器构造: 如果你有一个迭代器并且想根据它的元素创建一个排序列表,可以直接在初始化时传入。

性能考虑

  • 内存效率: SortedList 相比标准库中的 list 在内存使用上更加高效,尤其是在处理大量数据时,因为它内部实现了优化的存储结构。

  • 线程安全: sortedcontainers 的所有容器都是线程安全的,可以在多线程环境中无锁使用。

实例:范围查询与交集

  • 范围查询: 利用 irange(start, stop[, reverse]) 方法,可以获取一个迭代器,该迭代器产生指定范围内的元素。这对于执行范围查询非常有用。

    range_query = sl.irange(3, 7)
    for num in range_query:
        print(num)
    
  • 集合操作: 虽然 SortedList 不是集合,但它支持一些类似集合的操作,例如两个 SortedList 之间的交集可以通过简单的迭代实现,或者使用外部逻辑来达到目的,因为直接的集合运算接口不像 set 那样内置。

sortedcontainers.SortedList 提供了一个强大而灵活的有序序列实现,适用于对数据有序性有严格要求的应用场景。其高效的插入、删除、查找操作以及额外的高级特性使其成为处理有序数据时的一个优秀选择。希望这些额外的说明能够帮助你更好地理解和应用 SortedList

高级特性与最佳实践

自定义比较函数

默认情况下,SortedList 根据元素的自然顺序进行排序。但是,你可以提供一个自定义的比较函数来自定义排序规则。这可以通过在创建 SortedList 时传递 key 参数来实现。注意,sortedcontainers 库本身不直接支持像 sorted() 函数中的 key 参数,但你可以通过创建一个包装器函数间接实现这一功能。

def custom_sort_key(item):
    return item.lower()  # 例如,按字符串的小写形式排序

# 使用列表推导式和自定义排序键创建 SortedList
sl_custom = SortedList([item for item in ['Banana', 'apple', 'Cherry']], key=custom_sort_key)
print(sl_custom)  # 输出: ['apple', 'Banana', 'Cherry']
并行处理与多线程

由于 sortedcontainers 的线程安全性,你可以在多线程环境下安全地读取 SortedList 而无需额外的锁机制。然而,写操作(如添加或删除元素)仍然需要外部同步机制来避免数据竞争,尽管内部结构设计为减少锁争用。

性能调优
  • 批量操作: 对于大量数据的添加,尽量使用 update() 方法而不是单个 add(),因为这可以减少整体的排序和结构调整次数。
  • 空间预分配: 如果你知道 SortedList 大致会增长到多大,可以通过构造函数的 capacity 参数预先分配内存,避免多次重新分配内存带来的开销。
与其他数据结构结合使用
  • SortedDict 结合: 如果你需要一个键值对的有序字典,并且键是唯一的,可以考虑使用 SortedDict。它同样来自 sortedcontainers 库,提供了类似的功能,但针对键值对进行了优化。
  • 与集合操作: 虽然直接的交集、并集等操作不像 Python 的 set 类型那样直接内置,但你可以通过迭代和条件逻辑手动实现这些操作,或者将 SortedList 转换为 set 进行操作后再转换回来(注意这会失去顺序信息)。

SortedList 是一个功能强大、性能优秀的数据结构,特别适合于需要维护元素有序性的应用场景。通过合理利用其提供的高级特性和注意一些最佳实践,可以进一步提升代码的效率和可维护性。无论是进行简单的排序列表管理,还是复杂的范围查询和集合操作,SortedList 都是一个值得掌握的工具。

应用案例

这里有几个不同领域的应用案例,展示了如何使用Python的sortedcontainers.SortedList来解决实际问题:

1. 金融交易记录分析

场景: 在处理大量金融交易记录时,需要快速找出特定时间段内的交易或者按照交易额排序来分析市场活动。

应用: 使用SortedList存储交易记录,交易记录包含时间戳和交易额。通过bisect_leftirange方法,可以迅速找到某个时间窗口内的所有交易,或者对交易额进行排序来分析最高和最低交易活动。

2. 日志文件管理

场景: 系统日志文件需要按时间顺序存储和快速检索特定时间段的日志条目。

应用: 将日志条目(包括时间戳和日志内容)存储在SortedList中。当需要查询特定时间段的日志时,利用irange方法来快速定位并迭代相关日志条目,提高日志分析效率。

3. 学生成绩管理系统

场景: 教育机构需要对学生的考试成绩进行排序和分析,比如找出排名前10%的学生名单。

应用: 使用SortedList保存学生分数,利用其自然排序特性轻松实现成绩排序。通过islice结合总人数计算,可以快速找出成绩最高的学生列表。

4. 实时数据分析

场景: 在物联网(IoT)项目中,实时收集传感器数据,需要快速识别出超出阈值的数据点。

应用: SortedList可以用来存储按时间或数值大小排序的传感器读数。通过比较新数据点与列表中的数据,可以迅速判断是否触发警报或进行相应的数据分析。

5. 社交媒体热门话题追踪

场景: 在社交媒体平台上,需要动态追踪并展示当前最热门的话题或帖子。

应用: 使用SortedList存储帖子或话题,根据点赞数、评论数等指标排序。定期更新列表,确保展示的内容始终是最新的热门话题。通过高效的插入和删除操作,可以维持一个实时更新的热门列表。

这些案例展示了SortedList在数据管理、分析、实时处理等多个领域的灵活性和高效性,体现了其作为数据结构在实际应用中的价值。

😍😍 大量H5小游戏、微信小游戏、抖音小游戏源码😍😍
😍😍试玩地址: https://www.bojiogame.sg😍😍
😍看上哪一款,需要源码的csdn私信我😍

————————————————

​最后我们放松一下眼睛
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/623670.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机Java项目|Springboot学生读书笔记共享

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简…

基于SpringBoot设计模式之创建型设计模式·抽象工厂模式

文章目录 介绍开始架构图(以穿搭举例)样例一(html关于列表和表格的应用)定义抽象工厂(html)定义抽象工厂需要制作抽象产物(托盘)定义具体工厂(列表、表格)定义…

开源模型应用落地-CodeQwen模型小试-集成langchain(四)

一、前言 通过学习代码专家模型,开发人员可以获得高效、准确和个性化的代码支持。这不仅可以提高工作效率,还可以在不同的技术环境中简化软件开发工作流程。代码专家模型的引入将为开发人员带来更多的机会去关注创造性的编程任务,从而推动软件…

webpack并行构建示例:

由于js的单线程特性,文件和任务时 要等待一个任务执行完成后执行下一个任务,但在实际开发中,很多任务是可以并行执行的(如同时处理多个不同js文件或同事压缩多张图片),一些loader和插件(thread-…

交通地理信息系统实习教程(二)

这篇文章服务于GIS背景用户以及有志于GIS的朋友 操作源数据位置:【免费】交通地理信息系统实习二源数据资源-CSDN文库 软件安装包位置:【免费】TransCad-交通地理信息系统软件资源-CSDN文库 一、最短路径分析 1.1软件启动说明 这里需要给出一个必要的…

png格式怎么压缩的更小?用这几个方法轻松搞定

png格式支持透明背景,因此在网页设计中经常使用,经常用于创建图标、按钮、徽标和其他元素,使其能够与不同背景颜色和图像融合,实现更好的视觉效果,所以有时候我们就会遇到需要把png图片压缩小一点的情况,这…

【计算机网络】Socket网络编程

💻文章目录 📄前言Socket编程基础概念工作原理 Socket API介绍socket函数绑定、监听函数accept、connect接受/发送函数 Socket API的应用Socket类与其派生类的设计服务器与客户端的设计使用 📓总结 📄前言 现今我们的日常生活当中…

【经典文献】光声立体成像的对极几何

文献标题:《Epipolar Geometry of Opti-Acoustic Stereo Imaging》作者列表:Shahriar Negahdaripour发表期刊:IEEE Transactions on Pattern Analysis and Machine Intelligence发表年份:2007DOI链接:10.1109/TPAMI.20…

EPS软件标注点坐标值

1、如下,点击右侧(尺寸标注)按钮: 2、弹出一个对话框,如下: 3、在上图对话框中设置好箭头样式和小数位数,然后点击图上一点,右击结束再鼠标指定位置,如下: 如…

Lists.partition用法详解

文章目录 一、引入依赖二、用法三、输出 一、引入依赖 依赖于谷歌的guava 包 <!-- guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>28.1-jre</version></dependency&…

LeetCode算法题:49. 字母异位词分组(Java)

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", …

【吃透Java手写】5-RPC-简易版

【吃透Java手写】RPC-简易版-源码解析 1 RPC1.1 RPC概念1.2 常用RPC技术或框架1.3 初始工程1.3.1 Productor-common&#xff1a;HelloService1.3.2 Productor&#xff1a;HelloServiceImpl1.3.3 Consumer 2 模拟RPC2.1 Productor2.2 模拟一个RPC框架2.2.1 HttpServer2.2.2 Http…

如何安全高效地进行4S店文件分发,保护核心资产?

4S店与总部之间的文件分发是确保双方沟通顺畅、信息共享和决策支持的重要环节。4S店文件分发涉及到以下文件类型&#xff1a; 销售报告&#xff1a;4S店需要定期向总部提交销售报告&#xff0c;包括销售数量、销售额、市场份额等关键指标。 库存管理文件&#xff1a;包括车辆库…

Linux-基础IO

&#x1f30e;Linux基础IO 文章目录&#xff1a; Linux基础IO C语言中IO交互       常用C接口         fopen         fputs         fwrite         fgets 当前路径       三个文件流 系统文件IO       open函数     …

windows 环境下安装《车辆动态监控系统》支持JT808、JT1078、苏标主动安全设备接入

《车辆动态监控系统》下载安装部署包 开放端口 80/443/8800&#xff0c;web后台端口&#xff0c;nginx代理服务&#xff0c;nginx默认为8800端口8808&#xff0c;JT808专用端口6802&#xff0c;视频播放推流端口6891-6898&#xff0c;FTP端口6821&#xff0c;苏标主动安全附件…

一. Ast - 反混淆(基础篇)

目录 ​编辑 1. 什么是Ast-了解 2. 什么是反混淆-了解 3. 了解Ast结构 4. 思考 5. 前置准备 6. 什么是babel 7. 安装babel 8. ast反混淆代码基本结构 9. babel中的组件 parser与generator 组件 traverse 组件 与visitor enter与exit visitor 其他写法 traverse …

Python API和微服务的测试库之httpretty使用详解

概要 在现代软件开发中,API和微服务的测试是确保应用稳定性和功能正确性的关键环节。Python的HTTPretty库提供了一个强大的工具,允许开发者在不实际发起网络请求的情况下模拟HTTP请求和响应。本文将全面介绍HTTPretty的安装、特性、基本与高级功能,并结合实际应用场景,展示…

FebHost:什么是汤加.TO域名?

什么是.TO域名&#xff1f; 汤加域名是指在顶级域.to下注册的域名&#xff0c;.to域名是汤加的国家代码顶级域&#xff08;ccTLD&#xff09;。它类似于其他特定国家的域名后缀&#xff0c;如美国的”.us “或英国的”.uk”。 汤加国家介绍 汤加正式名称为汤加王国&#xff…

Java入门基础学习笔记19——关系运算符、逻辑运算符

关系运算符&#xff1a; 判断数据是否满足条件&#xff0c;最终会返回一个判断的结果&#xff0c;这个结果是布尔类型的值&#xff1a;true或false。 注意&#xff1a;在java中判断是否相等一定是“”&#xff0c;不要把“”写成“”&#xff0c;“”是赋值表达式。 package c…

【kubeflow文档】kubeflow介绍与架构

1. kubeflow介绍 Kubeflow项目致力于使机器学习&#xff08;ML&#xff09;工作流在Kubernetes上的部署变得简单、可移植和可扩展。目标不是重新创建其他服务&#xff0c;而是提供一种直接的方法&#xff0c;将ML的开源系统部署到不同的基础设施中。无论在哪里运行Kubernetes&a…