Python高阶函数-sorted(深度解析从原理到实战)

在这里插入图片描述

一、sorted()函数概述

sorted()是Python内置的高阶函数,用于对可迭代对象进行排序操作。与列表的sort()方法不同,sorted()会返回一个新的已排序列表,而不改变原数据。

基本语法

sorted(iterable, *, key=None, reverse=False)

二、核心参数详解

1. iterable(必需参数)

任何可迭代对象(列表、元组、字符串、字典等)

2. key(关键参数)

  • 接受一个函数作为参数
  • 该函数会被应用到每个元素上,根据函数返回值进行排序
  • 默认值为None,表示直接比较元素本身

3. reverse(排序方向)

  • 布尔值参数
  • False表示升序(默认)
  • True表示降序

三、底层实现原理

sorted()内部使用TimSort算法(一种混合了归并排序和插入排序的稳定算法):

  • 时间复杂度:O(n log n)
  • 空间复杂度:O(n)
  • 稳定性:保持相等元素的原始顺序
# 伪代码展示基本逻辑
def sorted(iterable, key=None, reverse=False):# 1. 获取可迭代对象的元素列表elements = list(iterable)# 2. 如果有key函数,应用转换if key is not None:decorated = [(key(x), i, x) for i, x in enumerate(elements)]else:decorated = elements# 3. 执行TimSort排序decorated.sort()# 4. 还原原始数据(保持稳定性)if key is not None:result = [x for (k, i, x) in decorated]else:result = decorated# 5. 处理排序方向if reverse:result.reverse()return result

四、高级使用技巧

1. 复杂对象排序

students = [{'name': 'Alice', 'age': 20, 'score': 85},{'name': 'Bob', 'age': 19, 'score': 92},{'name': 'Charlie', 'age': 21, 'score': 78}
]# 按分数降序排序
sorted_students = sorted(students, key=lambda x: x['score'], reverse=True)

2. 多条件排序

# 先按年龄升序,年龄相同按分数降序
sorted_students = sorted(students,key=lambda x: (x['age'], -x['score']))

3. 使用operator模块

from operator import itemgetter, attrgetter# 等价于 lambda x: x['score']
sorted_students = sorted(students, key=itemgetter('score'))# 类对象排序
class Student: ...
sorted_students = sorted(students, key=attrgetter('age'))

4. 自定义排序规则

def custom_sort(x):# 奇偶数优先排序:奇数在前,数值小的在前return (x % 2 == 0, x)nums = [3, 1, 4, 2]
sorted_nums = sorted(nums, key=custom_sort)  # [1, 3, 2, 4]

五、性能优化建议

  1. 避免在key函数中进行复杂计算:key函数会被频繁调用,应保持简单高效
  2. 考虑使用生成器:对于大数据集,可以先用生成器预处理
  3. 预编译key函数:对于重复使用的key函数,可以预编译或缓存结果
  4. 考虑稳定性需求:当需要保持相等元素的原始顺序时,sorted()是更好的选择

六、与sort()方法的对比

特性sorted()list.sort()
返回值新列表None(原地修改)
原始数据不改变直接修改
适用对象任何可迭代对象仅列表
链式操作支持不支持
内存使用更高(需要副本)更低

七、实际应用案例

1. 日志文件按时间排序

log_lines = ["2023-01-15 ERROR: Disk full","2023-01-10 INFO: System started","2023-01-12 WARNING: Memory low"
]sorted_logs = sorted(log_lines, key=lambda x: x.split()[0])

2. 文件名自然排序

import refiles = ["file1.txt", "file10.txt", "file2.txt"]
sorted_files = sorted(files, key=lambda x: int(re.search(r'\d+', x).group()))

3. 多语言字符串排序

import locale
locale.setlocale(locale.LC_COLLATE, 'fr_FR.UTF-8')words = ['été', 'hôtel', 'arbre']
sorted_words = sorted(words, key=locale.strxfrm)

八、常见问题解答

Q1: sorted()如何处理None值?
A: 在Python中,None不能与其他值比较。解决方案:

sorted_list = sorted(mixed_list, key=lambda x: (x is None, x))

Q2: 如何实现自定义排序类?

class CustomOrder:_order = ['high', 'medium', 'low']def __init__(self, value):self.value = valuedef __lt__(self, other):return self._order.index(self.value) < self._order.index(other.value)sorted_items = sorted([CustomOrder(x) for x in ['low', 'high', 'medium']])

Q3: 超大文件如何高效排序?
使用外部排序(分块读取+归并):

def external_sort(file_path):# 分块读取并排序chunks = []with open(file_path) as f:while True:chunk = list(itertools.islice(f, 10000))  # 每次读1万行if not chunk:breakchunk.sort()chunks.append(chunk)# 多路归并return list(heapq.merge(*chunks))

九、总结

sorted()作为Python的核心高阶函数,其强大之处在于:

  • 灵活的参数设计(特别是key函数)
  • 稳定的排序算法
  • 广泛的应用场景
  • 优秀的性能表现

掌握sorted()的高级用法,可以让你写出更Pythonic、更高效的排序代码。建议在实际项目中多实践各种排序场景,深入理解其底层原理。

扩展阅读:Python官方文档中关于排序指南的详细说明

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

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

相关文章

ArcGIS Pro/GeoScene Pro AI 助手 2.1

引言 面对ArcGIS Pro/GeoScene Pro复杂的操作界面和脚本开发需求&#xff0c;你是否还在为功能定位、代码调试和效率优化而烦恼&#xff1f;今天&#xff0c;推出自制的Pro AI助手2.0版本&#xff0c;七大核心功能将革新你的GIS工作方式&#xff01;无论是界面操作指引、一键生…

如何将本地更改的README文件同步到自己的GitHub项目仓库

如何将本地更改的 README 文件同步到 GitHub 仓库 在你 git clone 下来的工程目录下&#xff1a; 先使用 robocopy YOUR\SOURCE\CODE\DIR YOUR\GIT\CLONE\DIR /E /XD .git /DCOPY:T 将你的更改Copy到你git下来的工程中&#xff08;上面的命令会自动处理&#xff0c;例如只会C…

PostIn V1.0.8版本发布,IDEA 插件支持一键扫描上报,让接口定义不再繁琐

PostIn是一款国产开源免费的接口管理工具&#xff0c;包含项目管理、接口调试、接口文档设计、接口数据MOCK等模块&#xff0c;支持常见的HTTP协议、websocket协议等&#xff0c;支持免登陆本地接口调试&#xff0c;同时可以对项目进行灵活的成员权限、消息通知管理等。本周Pos…

UE5学习笔记 FPS游戏制作36 UI动画

文章目录 目的效果创建动画UI准备制作动画 播放动画目的效果创建动画UI准备制作动画 播放动画注册播放事件 目的效果 我们要创建一个提示动画&#xff0c;文字先渐显&#xff0c;然后向上移动&#xff0c;同时渐隐 创建动画 UI准备 创建一个UI控件&#xff0c;然后创建一个…

HTTP 响应头 Strict-Transport-Security 缺失漏洞

HTTP 响应头 Strict-Transport-Security 缺失漏洞 这个漏洞就是说明网站的HTTP响应头中没有设置Strict-Transport-Security&#xff0c;没有设置则可以通过将https自己手动改成htttp的方式进行访问。不安全 解决方法 1.nginx配置 nginx中增加如下配置&#xff1a; location / …

代理模式的优缺点是什么?

什么是代理模式&#xff1f; 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过创建代理对象来控制对原始对象的访问。 这种模式在前端开发中广泛应用&#xff0c;特别是在需要控制对象访问、添加额外逻辑或优化性能的场景中。 ​​核心…

【嵌入式学习3】UDP发送端、接收端

目录 1、发送端 2、接收端 3、UDP广播 1、发送端 from socket import *udp_socket socket(AF_INET,SOCK_DGRAM) udp_socket.bind(("127.0.0.1",3333))data_str "UDP发送端数据" data_bytes data_str.encode("utf-8") udp_socket.sendto(d…

AI重构SEO关键词精准布局

内容概要 在传统SEO策略面临搜索场景碎片化、用户意图复杂化的挑战下&#xff0c;AI技术通过多维数据分析与算法建模&#xff0c;正在重构关键词布局的逻辑框架。基于自然语言处理&#xff08;NLP&#xff09;的语义分析能力&#xff0c;AI可精准识别搜索词背后的需求层级&…

谷歌发布网络安全AI新模型Sec-Gemini v1

谷歌近日宣布推出实验性AI模型Sec-Gemini v1&#xff0c;旨在通过人工智能技术革新网络安全防御体系。该模型由Sec-Gemini团队成员Elie Burzstein和Marianna Tishchenko共同研发&#xff0c;旨在帮助网络安全人员应对日益复杂的网络威胁。 攻防不对称的破局之道 Sec-Gemini团队…

IntelliJ IDEA下开发FPGA——FPGA开发体验提升__下

前言 由于Quartus写代码比较费劲&#xff0c;虽然新版已经有了代码补全&#xff0c;但体验上还有所欠缺。于是使用VS Code开发&#xff0c;效果如下所示&#xff0c;代码样式和基本的代码补全已经可以满足开发&#xff0c;其余工作则交由Quartus完成 但VS Code的自带的git功能&…

Python语言的需求分析

Python语言的需求分析 引言 在信息技术快速发展的今天&#xff0c;编程语言的选择对于软件开发的成功与否起着至关重要的作用。Python作为一种高级编程语言&#xff0c;以其简洁易读的语法和强大的功能受到越来越多开发者的青睐。通过对Python语言的需求分析&#xff0c;我们…

抓wifi无线空口包之Ubuntu抓包(二)

一、设置网卡信道和频段&#xff0c;并抓包 1、使用iwconfig查看自己机器的无线网卡名称 wangwang-ThinkCentre-M930t-N000:~$ iwconfig lo no wireless extensions. eno1 no wireless extensions. enxc8a3624ab329 no wireless extensions. wlx90de80d1b5b1 IE…

深度学习实战电力设备缺陷检测

本文采用YOLOv11作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv11以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对电力设备缺陷数据集进行训练和优化&#xff0c;该数据集包含丰富的电力设备缺…

Day1:前端项目uni-app壁纸实战

uni-app官网下载HBuilder。 uni-app快速上手 | uni-app官网 点击HBuilder 安装 新建项目 工具——插件安装 安装uni-app&#xff08;vue3&#xff09; 我们先来准备一下&#xff1a; 先在wallpaper下新建目录 我已经建过了 同样&#xff0c;再在common下建images和style目录&…

mac命令操作

mac命令操作 快速删除一行&#xff1a; control u 剪切文件&#xff1a;步骤1、先进行Command c 进行选择复制文件&#xff0c;2、进行commandoptionv进行移动文件&#xff0c;如果commandv是进行复制文件。 commandcontrolD 三个键即可屏幕取词进行翻译 mac中可以使用快捷方…

C#语言的加密货币

C#语言与加密货币&#xff1a;一个开发者的探索之旅 引言 随着区块链技术的迅猛发展&#xff0c;加密货币的应用已经渗透到我们生活的方方面面。作为一种新兴的数字资产&#xff0c;加密货币不仅改变了传统的投资方式&#xff0c;而且对全球经济产生了深远影响。其中&#xf…

Mysql 概念

MySQL 是一种 关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它使用 结构化查询语言&#xff08;SQL&#xff09; 来管理和操作数据。它最初由瑞典公司 MySQL AB 开发&#xff0c;后来被 Sun Microsystems 收购&#xff0c;现在属于 Oracle 公司。 一、MySQL…

Golang 项目平滑重启

引言 平滑重启&#xff08;Graceful Restart&#xff09;技术作为一种常用的解决方案&#xff0c;通过允许新进程接管而不中断现有的请求&#xff0c;确保了系统的稳定运行和业务连续性。同时目前公司的服务重启绝大部分也都适用的 go 的平滑重启技术。 本部分将对平滑重启的…

SQL SELECT DISTINCT 语句详解:精准去重的艺术

在数据驱动的时代&#xff0c;数据质量直接影响决策的准确性。面对海量数据时&#xff0c;重复记录如同沙砾中的金屑&#xff0c;既占用存储空间&#xff0c;又干扰分析结果。SELECT DISTINCT 语句便是那把高效的筛子&#xff0c;助您快速剔除冗余&#xff0c;提取唯一值。本文…

16-产品经理-需求的评审

在创建需求的时候&#xff0c;有一个"不需要评审"的复选框&#xff0c;如果选中该复选框的话&#xff0c;需求的创建成功后状态是激活的。 但大部分情况下面&#xff0c;需求还是需要评审的。 即使产品完全由一个人负责&#xff0c;也可以将一些不成熟的想法存为草…