前言
本文主要给大家了关于利用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
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 好薇2024《兵哥哥》1:124K黄金母盘[WAV+CUE]
- 胡歌.2006-珍惜(EP)【步升大风】【FLAC分轨】
- 洪荣宏.2014-拼乎自己看【华特】【WAV+CUE】
- 伊能静.1999-从脆弱到勇敢1987-1996精选2CD【华纳】【WAV+CUE】
- 刘亮鹭《汽车DJ玩主》[WAV+CUE][1.1G]
- 张杰《最接近天堂的地方》天娱传媒[WAV+CUE][1.1G]
- 群星《2022年度发烧天碟》无损黑胶碟 2CD[WAV+CUE][1.4G]
- 罗文1983-罗文甄妮-射雕英雄传(纯银AMCD)[WAV+CUE]
- 群星《亚洲故事香港纯弦》雨果UPMAGCD2024[低速原抓WAV+CUE]
- 群星《经典咏流传》限量1:1母盘直刻[低速原抓WAV+CUE]
- 庾澄庆1993《老实情歌》福茂唱片[WAV+CUE][1G]
- 许巍《在别处》美卡首版[WAV+CUE][1G]
- 林子祥《单手拍掌》华纳香港版[WAV+CUE][1G]
- 郑秀文.1997-我们的主题曲【华纳】【WAV+CUE】
- 群星.2001-生命因爱动听电影原创音乐AVCD【MEDIA】【WAV+CUE】