Python的sort()与sorted()排序函数的区别

文章目录

  • 一、工具
  • 二、需求
  • 三、简单的使用例子
  • 四、原理分析
    • Timsort算法主要特点:
    • Timsort算法的工作原理:
    • `sort()` 方法和 `sorted()` 函数的差异:
  • 五、Python中的单例实现简单示例

一、工具

Python 3.10.0
pycharm 2022

二、需求

最近做项目的时候用到了这两个函数,以前没注意,仔细研究一下,这两个函数还是有很大区别的

三、简单的使用例子

在Python中,你可以使用内置的sort()方法或者sorted()函数对列表进行排序。

  1. sort() 方法 - 会修改原始列表,使其元素按照一定顺序排列。默认情况下,排序是升序的。
my_list = [3, 1, 4, 1, 5, 9, 2, 6]
my_list.sort()
print(my_list)  # 输出: [1, 1, 2, 3, 4, 5, 6, 9]

如果你要按照降序排序,可以传递一个参数reverse=Truesort()方法:

my_list = [3, 1, 4, 1, 5, 9, 2, 6]
my_list.sort(reverse=True)
print(my_list)  # 输出: [9, 6, 5, 4, 3, 2, 1, 1]

你还可以提供一个自定义的关键字参数key来实现自定义排序逻辑:

my_list = ['apple', 'banana', 'cherry', 'date']
my_list.sort(key=len)  # 根据字符串长度排序
print(my_list)  # 输出: ['date', 'apple', 'banana', 'cherry']
  1. sorted() 函数 - 会返回一个新的列表,并且不会改变原始的列表。用法和sort()类似,但是它可以用于任何可迭代对象:
my_list = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_list = sorted(my_list)
print(sorted_list)  # 输出: [1, 1, 2, 3, 4, 5, 6, 9]

同样地,你也可以使用reversekey参数:

my_list = ['apple', 'banana', 'cherry', 'date']
sorted_list = sorted(my_list, key=len, reverse=True)
print(sorted_list)  # 输出: ['banana', 'cherry', 'apple', 'date']

这里的len是Python内置函数,用来获取列表中每个元素的长度作为排序的依据(即排序键)。sort()和sorted()都支持自定义的函数作为key参数,这允许你进行更复杂的排序操作。

选择sort()方法还是sorted()函数取决于是否需要保留原始列表不变,以及是否需要对任意可迭代对象进行排序

四、原理分析

在Python中,sort()方法和sorted()函数背后的排序机制是基于Tim Peters开发的Timsort算法。Timsort是一种混合型排序算法,它源自归并排序(Merge Sort)和插入排序(Insertion Sort)。Timsort算法在2002年被引入到Python中,并且因为其卓越性能成为Python的默认排序算法。

Timsort算法主要特点:

  1. 稳定性:如果列表中存在相等的元素,它们原始的顺序不会改变。
  2. 自适应性:在接近排好序的数据集上表现更佳。
  3. 复杂度: 最坏情况时间复杂度为O(n log n)。 最优情况(已经排好序的数据集)时间复杂度为O(n)。 平均情况时间复杂度也是O(n log n)。

Timsort算法的工作原理:

  1. 查找或创建自然运行:Timsort首先遍历数据,查找自然有序的小段,称为“运行”(runs),这些可以是已经排好序的子列表。如果没有找到足够大小的运行,则使用二分插入排序将它们扩展到最小运行大小(通常为32或64个元素)。这一步骤允许算法利用输入数据中的任何固有顺序。

  2. 运行堆积(Run Stacking):一旦识别出所有的运行之后,Timsort会按照一定规则将它们合并,直到只剩下一个运行为止。这个过程中,Timsort会尽可能地合并那些长度相近的相邻运行。

  3. 归并排序:合并过程是通过归并排序完成的,这是一种将两个或多个有序列表组合成单一有序列表的技术。通过重复此过程,直到整个数组变得有序。

sort() 方法和 sorted() 函数的差异:

  1. sort() 方法:

是列表(list)的内置方法。
会就地(in-place)对列表进行排序,即不需要额外的存储空间来创建新列表,但原始列表内容会被改变。
2. sorted() 函数:

是内建函数,可以对任意可迭代对象进行排序操作。
返回一个新的列表,原始输入数据不会被修改。
尽管sort()和sorted()使用相同的排序算法(Timsort),它们在数据处理方式上存在差异,体现在是否会改变原始数据以及它们各自的适用范围。

在高级实现中,Timsort还涉及很多优化措施,比如对小数组使用插入排序、合并时考虑已排序的序列以及优化的比较和移动过程等。这些细微的优化使得Timsort成为一种非常快速且高效的排序算法,在现代编程语言中得到广泛采用。

五、Python中的单例实现简单示例

要实现一个只需实例化一次的类,你可以使用设计模式中的单例模式。在Python中,有多种方式实现单例模式。下面给出两种常见的实现方式:

  1. 使用类变量:
class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if cls._instance is None:cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)return cls._instance# 使用示例
singleton1 = Singleton()
singleton2 = Singleton()assert singleton1 is singleton2  # 检查singleton1和singleton2是否是同一个实例

在这个例子中,我们重写了__new__方法,它是在创建实例之前被调用的特殊方法。__new__方法确保只创建单例类的一个实例,并且后续尝试创建新实例时都返回第一个创建的实例。

  1. 使用装饰器:
def singleton(cls):instances = {}def get_instance(*args, **kwargs):if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return get_instance@singleton
class MySingleton:pass# 使用示例
singleton1 = MySingleton()
singleton2 = MySingleton()assert singleton1 is singleton2  # 检查singleton1和singleton2是否是同一个实例

在这个例子中,我们使用了一个装饰器singleton,它接收一个类并返回一个函数get_instance。这个函数检查该类是否已经有一个实例存在于字典instances中,如果不存在就创建一个新的实例。如果已经存在,就返回那个实例。当你用@singleton装饰一个类时,你实际上把这个类替换成了get_instance函数。

两种方法都能够确保一个类在程序运行期间只有一个实例。选择哪种方式取决于你的具体需求和偏好。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务学习:RestTemplateWebClient发起的http请求实现远程调用

http请求做远程调用是与语言无关的调用,只要知道对方的ip,端口,接口路径,请求参数即可 启动类中配置: Beanpublic RestTemplate restTemplate(){return new RestTemplate();} Sevice中书写方法 get Autowiredprivate RestTemp…

2023-2024 年重庆市职业院校技能大赛 高职组“软件测试”赛项样题

2023-2024 年重庆市职业院校技能大赛 高职组“软件测试”赛项样题 单元测试要求分析、代码设计、设计测试数据、编写测试脚本和 测试执行等;测试计划、测试报告文档设计与编写;Web 端测试用例 设计、测试执行和 Bug 记录; 自动化测试要求分析…

点击按住说话按钮事件有延迟

问题原因: 该问题原因是由于系统的某些手势 delaysTouchesBegan 属性为 YES,当按钮处在某些特定位置时触摸事件会先被这些系统的手势拦截,系统不响应才会继续分发,而按钮的 UIControlEventTouchDown 事件是需要立即响应的&#xf…

Python数据处理的六种方式总结,Python零基础学习

文章目录 前言1、dedup()去重并排序2、traverse()拆分嵌套数组3、filter()数据筛选4、groupby()分组运算5、select()遍历结果集6、sort()数据排序 总结 前言 在 Python 的数据处理方面经常会用到一些比较常用的数据处理方式,比如pandas、numpy等等。 今天介绍的这…

vue图片预览 90度旋转

要在 Vue 3 中实现点击按钮让图片旋转 90 度&#xff0c;你可以使用 CSS 转换和 Vue 的事件处理来完成。这里是一个基本的示例&#xff1a; 首先&#xff0c;在你的组件的模板中&#xff0c;添加一个按钮和一个应用转换的图像&#xff1a; <template> <div> <…

使用粗糙贴图制作粗纹皮革手提包3D模型

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xf…

UniGui使用CSS优化PageControl

如题直接上代码 .x-tab-bar-default-top{background-image:none!important;background-color:#FFF !important;border-color:#f0f0f0 !important;border-left:none!important;border-right:none!important}.x-tab-bar-strip-default{border-color:#f0f0f0 !important;backgrou…

Redisson出现问题总结

org.redisson.client.RedisAuthRequiredException: NOAUTH Authentication required… channel: 出现此问题的原因为没有redis权限。解决方案在setAddress()后面加上setPassword()方法。 config.useSingleServer().setAddress("redis://localhost:6379").setPasswo…

Hugging Face 给普通用户提供了一个 2 vCPU 16GB 的免费空间

Hugging Face 给普通用户提供了一个 2 vCPU 16GB 的免费空间&#xff0c;并且支持部署 Gradio 构建的应用程序&#xff0c;非常方便&#xff0c;下面我们进入 https://huggingface.co/spaces/ &#xff0c;点击创建空间。

MySQL一 | SQL语句

目录 DDL语句 查询所有数据库 查询当前数据库 切换数据库 创建数据库 创建表 删除表 查询当前数据库所有表 查询表结构 查询指定表的键表语句 添加字段 修改数据类型 修改字段名和字段类型 删除字段 修改表名 删除表 删除指定表&#xff0c;并重新创建该表…

CCF: 202012-2 期末预测之最佳阈值--C++

#include<iostream> #include<bits/stdc.h>using namespace std;int main() {int n;//m位同学的数据int y[100001];//记录m位同学的安全指数int result[100001];//记录m位同学最后的挂科情况cin>>n;for(int i1;i<n;i){cin>>y[i]>>result[i];}…

unity 模型生成PNG图片并导出(可以任意控制方向和大小,本文提供三种方案)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、插件RuntimePreviewGenerator&#xff08;方案一&#xff09;二、unity 官方提供的接口&#xff08;方案二&#xff09;三、方法三&#xff0c;可以处理单个模型&#xff0c;也…

华为OD机试真题-智能成绩表-2023年OD统一考试(C卷)

题目描述: 小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名,你能帮帮他吗? 输入描述: 第1行输入两个整数,学生人数n和科目数量m。0<n<100,0<m<10 第2行输入m个科目名称,彼此之间用空格隔开。科目名称只由英文字母构成,单个长度不超过10个字符…

Linux下C++静态链接库的生成以及使用

目录 一.前言二.生成静态链接库三.使用静态链接库 一.前言 这篇文章简单讨论一下Linux下如何使用gcc/g生成和使用C静态链接库&#xff08;.a文件&#xff09;。 二.生成静态链接库 先看下目录结构 然后看下代码 //demo.h#ifndef DEMO_H #define DEMO_H#include<string&g…

线程状态:深入理解多任务并发编程中的精髓

目录 引言 1. 线程状态概述 1.1 定义 1.2 线程状态图 2. 线程状态的转换 2.1 新建到就绪 2.2 就绪到运行 2.3 运行到阻塞 2.4 运行到等待和超时等待 2.5 运行到终止 3. 实际编程中的线程状态管理 3.1 合理使用wait()和notify() 3.2 谨慎处理阻塞状态 3.3 使用线程…

面试题之Docker篇

1、Docker 是什么&#xff1f; Docker一个开源的应用容器引擎&#xff0c;是实现容器技术的一种工具&#xff0c;让开发者可以打包他们的应用以及环境到一个镜像中&#xff0c;可以快速的发布到任何流行的操作系统上。 2、Docker的三大核心是什么? 镜像&#xff1a;Docker的镜…

Elastic Support Hub 转向语义搜索

作者&#xff1a;Chris Blaisure 我们很高兴与大家分享 Elastic Support Hub 最近的增强功能&#xff1a;它现在由语义搜索提供支持&#xff01; 但在我们更详细地了解对 Elastic Support Hub 所做的更改及其对客户的影响之前&#xff0c;我们需要花点时间解释语义搜索的概念&…

el-form表单校验值为0提示校验不通过

el-form表单校验输入框值为0时提示校验不通过 配置validator自定义校验方法 这里举例在结构代码里加入校验规则 <el-form-item:prop"num":rules"[{required: true,message: 请输入数量,trigger: change,},{validator,trigger: blur}]" ><el-inpu…

【安卓】安卓xTS之Media模块 学习笔记(3) VTS测试

1. 背景 接下来进行正式的VTS测试。本章节还是以Media模块相关进行介绍。 VTS主要测的是内核和HAL层&#xff0c;media的hal层是以openMax&#xff08;即将废弃&#xff0c;今日2023.12&#xff09; 和 Codec2 (后续主流) 接口为主。 这里我们只看Codec2的要求&#xff0c;CDD…

统计字符

输入一行字符&#xff0c;分别统计出包含英文字母、空格、数字和其它字符的个数。 数据范围&#xff1a;输入的字符串长度满足1≤n≤1000 输入描述&#xff1a;输入一行字符串&#xff0c;可以有空格 输出描述&#xff1a;统计其中英文字符&#xff0c;空格字符&#xff0c;数…