Python基于自定义方法的排序

在Python中,排序是一个常见的任务,它可以帮助我们根据特定的规则对数据结构(如列表)中的元素进行排序。Python的内置排序方法,如列表的sort()函数和内置函数sorted(),提供了非常灵活的排序机制,特别是通过key参数,我们可以指定一个自定义的函数来决定排序的顺序。本文将探讨如何在Python中使用自定义方法来实现排序。

一、基础概念

在Python中,sort()方法会就地修改列表,使其元素按照指定的规则进行排序,而sorted()函数则会返回一个新的列表,原列表保持不变。两者都接受一个可选的key参数,该参数应该是一个函数,用于从每个元素中提取一个用于比较的关键字。

二、自定义排序方法

自定义排序方法通常是通过定义一个函数来实现的,该函数接受列表中的一个元素作为输入,并返回用于排序的关键字。这个关键字可以是元素的一个属性、一个计算结果,或者是对元素进行某种转换后的结果。

示例1:按字典中某个键的值排序

假设我们有一个字典列表,每个字典代表一个人的信息,包含姓名和年龄。我们想要根据年龄对这些人进行排序。

people = [
{'name': 'Alice', 'age': 30},
{'name': 'Bob', 'age': 25},
{'name': 'Charlie', 'age': 35}
] # 使用sorted函数和自定义key
sorted_people = sorted(people, key=lambda x: x['age'])
print(sorted_people)
# 输出: [{'name': 'Bob', 'age': 25}, {'name': 'Alice', 'age': 30}, {'name': 'Charlie', 'age': 35}]

在这个例子中,我们使用了一个lambda函数作为key参数,该函数从字典中提取age键的值作为排序的关键字。

示例2:按字典中某几个键的总值排序

如果我们有一个自定义的类,并且想要根据类的某个属性对类的实例列表进行排序,我们也可以定义一个自定义的排序方法。

students = [
{'name': 'Alice', 'python': 30, 'java': 20, "html": 23},
{'name': 'Bob', 'python': 56, 'java': 32, "html": 21},
{'name': 'Charlie', 'python': 78, 'java': 34, "html": 43}
] # 使用sorted函数和自定义key
sorted_students = sorted(students, key=lambda x: x['python']+x['java']+x['html']) for i in sorted_students:
print(i)
# 输出:
# {'name': 'Alice', 'python': 30, 'java': 20, 'html': 23}
# {'name': 'Bob', 'python': 56, 'java': 32, 'html': 21}
# {'name': 'Charlie', 'python': 78, 'java': 34, 'html': 43}

在这个例子中,我们使用了一个lambda函数作为key参数,该函数从字典中提取pythonjavahtml键的值作为排序的关键字。

三、高级排序

除了基于单个关键字的排序外,Python还允许我们进行更复杂的排序,比如先按一个关键字排序,如果第一个关键字相同,则按第二个关键字排序,依此类推。这可以通过嵌套使用tuple作为key函数的返回值来实现。

示例3:多条件排序

people = [
{'name': 'Charlie', 'age': 25},
{'name': 'Alice', 'age': 25},
{'name': 'Bob', 'age': 25},
] # 假设我们想要先按年龄排序,如果年龄相同,则按姓名排序
sorted_people = sorted(people, key=lambda x: (x['age'], x['name']))
print(sorted_people)
# 输出: [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 25}, {'name': 'Charlie', 'age': 25}]

Python基于自定义方法的排序的更多相关文章

  1. Python基于比较的排序

    排序是算法学习中最基本的问题. 1.平均时间复杂度均为O(N2)的排序 1.1 插入排序 插入排序对少量元素的排序非常有效.工作机制就像打牌一样,为了将牌插入到已排好序的牌中,需要将牌与手中的牌从右向 ...

  2. 漫谈python中的搜索/排序

    在数据结构那一块,搜索有顺序查找/二分查找/hash查找,而排序有冒泡排序/选择排序/插入排序/归并排序/快速排序.如果遇到数据量和数组排列方式不同,基于时间复杂度的考虑,可能需要用到混合算法.如果用 ...

  3. [python学习] 语言基础—排序函数(sort()、sorted()、argsort()函数)

    python的内建排序函数有 sort.sorted两个. 1.基础的序列升序排序直接调用sorted()方法即可 ls = list([5, 2, 3, 1, 4]) new_ls = sorted ...

  4. Python list列表的排序

    当我们从数据库中获取一写数据后,一般对于列表的排序是经常会遇到的问题,今天总结一下python对于列表list排序的常用方法: 第一种:内建函数sort() 这个应该是我们使用最多的也是最简单的排序函 ...

  5. python基于LeanCloud的短信验证

    python基于LeanCloud的短信验证 1. 获取LeanCloud的Id.Key 2. 安装Flask框架和Requests库 pip install flask pip install re ...

  6. Python基于共现提取《釜山行》人物关系

    Python基于共现提取<釜山行>人物关系 一.课程介绍 1. 内容简介 <釜山行>是一部丧尸灾难片,其人物少.关系简单,非常适合我们学习文本处理.这个项目将介绍共现在关系中的 ...

  7. Python 基于Python实现的ssh兼sftp客户端(上)

    基于Python实现的ssh兼sftp客户端   by:授客 QQ:1033553122 实现功能 实现ssh客户端兼ftp客户端:实现远程连接,执行linux命令,上传下载文件 测试环境 Win7 ...

  8. 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序

    题目: 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序 public static int maxGap(int nums[]) { if ( ...

  9. Python字典按值排序的方法

    Python字典按值排序的方法: 法1: (默认升序排序,加  reverse = True 指定为降序排序) # sorted的结果是一个list dic1SortList = sorted( di ...

  10. solr特点三: 基于Solr实现排序定制化参考

    排序实现有N种形式,最低成本.最快响应时间是目标 一份索引,支持N种排序策略并且在线互不干扰是要考虑的每一种实现,处理的场景是不同的,不要千篇一律 020排序,从索引到效果,有不少坑,这篇文章没有细说 ...

随机推荐

  1. 关于《完全手册Excel VBA典型实例大全——通过368个例子掌握》随书样例的下载

    按照早先下载的电子教程查看和编写vba,有些例子使用运行错误,想着看看原始文件.容易看到,网上有提供的doc或者pdf文档,都不完整,可能是{完全手册Excel_VBA典型实例大全:通过368个例子掌 ...

  2. 2022GPLT

    老板的作息表 检查任意一张时间表,找出其中没写出来的时间段. 输入第一行给出一个正整数 \(N\),为作息表上列出的时间段的个数.随后 \(N\) 行,每行给出一个时间段,格式为: hh:mm:ss ...

  3. C# 获取两经纬度之间的距离

    C# 获取两经纬度之间的距离 迷恋自留地 //地球半径,单位米 private const double EARTH_RADIUS = 6378137; /// <summary> /// ...

  4. vue 相同路由不同参数跳转时,不刷新

    在公共的router-view上加 :key="$route.fullPath  控制key属性变化

  5. LeetCode题集-9 - 回文数

    题目:给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false . 回文数 是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 例如,121 是回文,而 123 不 ...

  6. 【C#】【平时作业】习题-6-静态成员

    习题-6静态成员 一.概念题 1. 什么是静态成员 被static修饰的成员,叫做静态成员.静态成员是属于类的.通过类名直接访问. 当类第一次被访问的时候,就会将这个类下面的所有的静态成员创建在内存当 ...

  7. Qt开源作品40-图片及文字与base64编码互换

    一.前言 对于图片的传输,通俗的做法一般有两种,一种是直接二进制文件传输,比如先传输开始标记,带文件名称.文件字节长度,然后挨个分包发送.最后发送文件结束标记,这种方式必须要求接收方按照自己定义的规则 ...

  8. Qt开源作品14-导航按钮控件

    一.前言 导航按钮控件,主要用于各种漂亮精美的导航条,我们经常在web中看到导航条都非常精美,都是html+css+js实现的,还自带动画过度效果,Qt提供的qss其实也是无敌的,支持基本上所有的CS ...

  9. Pelco-D控制协议

    1. 通令参数: 标准速率为4800bps,无校验,  8位数据位,1位停止位 2.命令串格式: 一个PTZ控制命令为7字节的十六进制代码,格式如下: Word  1 Word2 Word 3 Wor ...

  10. 不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?

    本文由小白debug分享,原题"能 ping 通,TCP 就一定能连通吗?",下文进行了排版和内容优化. 1.引言 平时,我们想要知道,自己的机器到目的机器之间,网络通不通,一般会 ...