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

news/2024/7/3 4:19:14

文章目录

  • 一、工具
  • 二、需求
  • 三、简单的使用例子
  • 四、原理分析
    • 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 = None

    def __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://lihuaxi.xjx100.cn/news/1888539.html

相关文章

《C++新经典设计模式》之第22章 总结

《C新经典设计模式》之第22章 总结 面向对象程序设计原则 开放封闭原则:扩展开放,修改封闭,增加新功能时,已有代码不变,增加新类、新成员函数实现。依赖倒置原则:高层组件不应该依赖于底层组件&#xff08…

nginx使用bat命令快速启动

.bat文件代码 echo off D: ::进入nginx安装目录 cd D:\enviroment\nginx-1.24.0 ::start nginx -c ./conf/nginx.confrem 如果启动前已经启动nginx并记录下pid文件,会kill指定进程 nginx.exe -s stoprem 测试配置文件语法正确性 nginx.exe -t -c conf/nginx.confre…

视频号小店与小商店有什么区别?一篇文章带你了解!

我是电商珠珠 视频号小店和小商店都是腾讯开发出来的电商平台,视频号小店出现的比小商店要晚一些,所以很多想入驻的新手,在这两者之间容易混淆。 下面我就来跟大家详细的讲一下,这两者之间区别。 1、团队不同 虽然都是腾讯公司…

ANSYS 应力和应变(EPTO)

目录 EPTO 应力和应变 Maximum, Middle, and Minimum Principal 最大、中间和最小主应力(主应变) Intensity 强度 Equivalent Total Strain等效总应变 Equivalent (von Mises)冯米塞斯等效应力(应变) 参考 EPTO EPTO X,…

网线市场现状与发展趋势预测

随着物联网、5G、云计算等技术的迅速发展,全球对于高速、稳定的网络需求急剧增长,这进一步推动了网线市场的发展。各种网络应用场景,从家庭到企业、数据中心到智能城市,都需要大量的高质量网线来支持数据传输和通信需求。本文将对…

[MySQL]事务原理之redo log,undo log

🌈键盘敲烂,年薪30万🌈 目录 一、log日志文件 📕 事务执行流程 📕 redo log 📕 undo log 二、总结 👀再来一遍ACID 1. 原子性:原子性确保事务作为一个整体执行,要么…

光伏发电技术的应用领域有哪些?

受益于技术进步、规模经济、开放的市场竞争和行业经验的不断积累,光伏发电的成本在最近十年急剧下降。很多国家都将光伏发电作为关键的新兴产业,光伏发电获得更为广泛的应用。 一、家庭应用 家庭应用的分布式光伏发电,就是安装在住户房屋顶…

(202312)so-large-lm:Task01引言

文章目录 前言要点总结1 什么是语言模型2 大模型相关历史回顾3 这门课的意义4 课程结构介绍 前言 感谢开源学习的组织者与活动的发起者为我们带来so-large-llm这一可谓大语言模型的通识课。原项目地址为so-large-lm。 要点总结 基础比较烂,所以我会用我能理解&am…