Python实现按学生年龄排序的实际问题详解

发布时间 - 2026-01-11 03:00:15    点击率:

前言

本文主要给大家了关于利用Python按学生年龄排序的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:

问题:定义一个Class:包含姓名name、性别gender、年龄age,需要按年龄给学生排序。

输入:包含学生对象的List。

输出:按照年龄age进行排序好的List。

思路1:使用冒泡排序,比较相邻的学生,如果第一个学生的age值比第二个学生的age值大,那么就整体交换这两个元素。持续每次对越来越少的元素重复上面的步骤。一直到没有任何一对学生需要比较。

思路2:使用Python內建方法sorted()。

(这个问题其实是笔者面试时候手写的一个实际问题,比较面向小白,我们可以通过这样一个简单的问题复习Python的一些基础知识点)

1. 前期准备

1.1 定义Class

class Student(object):
 def __init__(self, name, gender, age):
 self.__name = name
 self.__gender = gender
 self.__age = age
 
 # 取得age属性
 def getAge(self):
 return self.__age
 
 # 打印
 def printStudent(self):
 return self.__name, self.__gender, self.__age

1.2 生成包含随机学生对象的List

# 生成包含随机学生对象的list
def generateStudent(num):
 # num为需要生成的测试对象数
 list = []
 for i in range(num):
 randName = ''.join(random.sample(string.ascii_letters, 4))
 randGender = random.choice(['Male', 'FeMale'])
 randAge = random.randint(10,30)
 s = Student(randName, randGender, randAge)
 list.append(s)
 return list

2. 开始排序

2.1 使用冒泡排序

思路已在开头介绍,我们直接来看代码:

def sortStudent(list):
 for i in range(len(list)):
 for j in range(1, len(list)-i):
  if list[j-1].getAge() > list[j].getAge():
  list[j-1], list[j] = list[j], list[j-1]
 return list

2.2 使用Python內建方法sorted

配合lambda表达式使用,非常简洁,代码如下:

sorted(list, key=lambda student: student.getAge()) # 将对象的age属性作为排序的Key

我们在这里补充一下 sorted() 和 lambda表达式 的相关知识点:

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

官方文档

关于参数的说明:

key specifies a function of one argument that is used to extract a comparison key from each list element: key=str.lower. The default value is None (compare the elements directly).
reverse is a boolean value. If set to True, then the list elements are sorted as if each comparison were reversed.

  • key里接收的可以是某一个指定的函数(如lambda函数)返回的一个值,作为指定的比较依据。
  • reverse默认是False从小到大排序,设置为True后可以从大到小。

关于稳定性的说明:

The built-in sorted() function is guaranteed to be stable.

(看到官方文档的说明中写道,这个方法是保证稳定的哟!)

关于原理:Python内置的sorted()方法背后使用的是Timsort算法,当数据越接近Ordered Data的时候,时间复杂度越接近O(N)。在我们的这个问题中,年龄属性是比较符合Ordered Data的。感兴趣的可以点击Timsort查看更多哈!

2.2.2 lambda表达式

直接看一个简单的例子就能明白了~

>>> pairs = [('one',1),('two',2),('three',3),('five',5),('zero',0),('four',4)]
>>> sorted(pairs, key=lambda pair: pair[1]) # List中每个tuple对的排序依据是tuple中的第2个值
[('zero', 0), ('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)] 

3. 执行测试

构建测试用的随机数据,计算两种方法的执行时间进行比较~

if __name__ == '__main__':

 # list 形式是[('hZDw', 'FeMale', 17)...]
 list = generateStudent(10000)

 # 方法1:使用冒泡排序
 start_Time1 = time.time()
 sortStudent(list)
 end_Time1 = time.time()
 # 方法1中,使用10000个测试数据的排序时间是22.243秒以上(非精确)
 print('%s cost time %s' % ('sortStudent' , end_Time1 - start_Time1))


 # 方法2:使用Python内建的sorted方法+lambda表达式
 # 由于sorted方法背后使用的timsort方法,当数据越接近Ordered data的时候,时间复杂度越接近O(N)。
 # 在这个例子里面,年龄属性是比较接近Ordered data的。
 start_Time2 = time.time()
 sorted(list, key=lambda student: student.getAge()) # 将对象的属性作为排序的Key
 end_Time2 = time.time()
 print('%s cost time %s' % ('sorted' , end_Time2 - start_Time2))

测试结果:

使用方法1(冒泡排序),当测试数据量是10000个的时候,排序时间是22.243秒左右。

使用方法2(內建方法),当测试数据量是1000000个的时候,排序时间的0.575秒左右。

虽然不是很精确,但差别显然可见啦!

以上。

如有错误,还望指正~

完整实现及测试可在Github找到:ActualProblem-Solution

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# python  # 按列排序  # 按时间排序  # 按某一列排序  # python 字典(dict)按键和值排序  # Python中对元组和列表按条件进行排序的方法示例  # python中合并两个文本文件并按照姓名首字母排序的例子  # python读取TXT到数组及列表去重后按原来顺序排序的方法  # python让图片按照exif信息里的创建时间进行排序的方法  # 这个问题  # 测试数据  # 多哈  # 的是  # 文档  # 秒左右  # 在这里  # 相关内容  # 在这个  # 第一个  # 就能  # 说了  # 如有  # 没有任何  # 两种  # 不多  # 不是很  # 执行时间  # 感兴趣  # 我们可以 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在服务器上三步完成建站并提升流量?  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  高性能网站服务器配置指南:安全稳定与高效建站核心方案  JS实现鼠标移上去显示图片或微信二维码  香港服务器网站卡顿?如何解决网络延迟与负载问题?  微信公众帐号开发教程之图文消息全攻略  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  Laravel如何使用Sanctum进行API认证?(SPA实战)  如何在腾讯云服务器快速搭建个人网站?  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  jQuery中的100个技巧汇总  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Laravel如何使用.env文件管理环境变量?(最佳实践)  iOS验证手机号的正则表达式  如何在万网自助建站平台快速创建网站?  🚀拖拽式CMS建站能否实现高效与个性化并存?  如何确保西部建站助手FTP传输的安全性?  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Laravel如何实现API速率限制?(Rate Limiting教程)  重庆市网站制作公司,重庆招聘网站哪个好?  手机软键盘弹出时影响布局的解决方法  如何为不同团队 ID 动态生成多个“认领值班”按钮  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  网站页面设计需要考虑到这些问题  Java解压缩zip - 解压缩多个文件或文件夹实例  魔方云NAT建站如何实现端口转发?  微信小程序 HTTPS报错整理常见问题及解决方案  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  潮流网站制作头像软件下载,适合母子的网名有哪些?  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel如何配置和使用缓存?(Redis代码示例)  Android okhttputils现在进度显示实例代码  Laravel定时任务怎么设置_Laravel Crontab调度器配置  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  详解jQuery停止动画——stop()方法的使用  网站制作企业,网站的banner和导航栏是指什么?  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel如何使用Service Container和依赖注入?(代码示例)  如何在不使用负向后查找的情况下匹配特定条件前的换行符  如何快速生成可下载的建站源码工具?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  Laravel怎么判断请求类型_Laravel Request isMethod用法  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法