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


Posted in Python onAugust 29, 2017

前言

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

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

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

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

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

思路2:使用Python?冉ǚ椒?orted()。

(这个问题其实是笔者面试时候手写的一个实际问题,比较面向小白,我们可以通过这样一个简单的问题复习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?冉ǚ椒?orted

配合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(?冉ǚ椒ǎ??辈馐允?萘渴?000000个的时候,排序时间的0.575秒左右。

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

以上。

如有错误,还望指正~

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

总结

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

Python 相关文章推荐
Python标准库之sqlite3使用实例
Nov 25 Python
python对html代码进行escape编码的方法
May 04 Python
python将unicode转为str的方法
Jun 21 Python
详谈python在windows中的文件路径问题
Apr 28 Python
python中类的属性和方法介绍
Nov 27 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
python循环定时中断执行某一段程序的实例
Jun 29 Python
python读取与处理netcdf数据方式
Feb 14 Python
Django-migrate报错问题解决方案
Apr 21 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
Oct 15 Python
详解基于python的图像Gabor变换及特征提取
Oct 26 Python
教你用Python matplotlib库制作简单的动画
Jun 11 Python
详解Python进程间通信之命名管道
Aug 28 #Python
基于Python闭包及其作用域详解
Aug 28 #Python
利用Python查看目录中的文件示例详解
Aug 28 #Python
Python如何通过subprocess调用adb命令详解
Aug 27 #Python
Python中序列的修改、散列与切片详解
Aug 27 #Python
Python正确重载运算符的方法示例详解
Aug 27 #Python
深入学习Python中的上下文管理器与else块
Aug 27 #Python
You might like
php5 and xml示例
2006/11/22 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
基于CakePHP实现的简单博客系统实例
2015/06/28 PHP
关闭ie窗口清除Session的解决方法
2014/01/10 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
2015/10/22 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
Bootstrap基本组件学习笔记之分页(12)
2016/12/08 Javascript
JS 实现banner图片轮播效果(鼠标事件)
2017/08/04 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
微信小程序实现的日期午别医生排班表功能示例
2019/01/09 Javascript
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
2019/05/05 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
python创建列表并给列表赋初始值的方法
2015/07/28 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
Python编程实现微信企业号文本消息推送功能示例
2017/08/21 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
Python新手学习装饰器
2020/06/04 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
CSS3 实现的火焰动画
2020/12/07 HTML / CSS
整理的15个非常有用的 HTML5 开发教程和速查手册
2011/10/18 HTML / CSS
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
html5自定义video标签的海报与播放按钮功能
2019/12/04 HTML / CSS
意大利领先的线上奢侈品销售电商:Eleonora Bonucci
2017/10/17 全球购物
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
元旦联欢会感言
2014/03/04 职场文书
合伙经营协议书
2014/04/18 职场文书
2015毕业寄语大全
2015/02/26 职场文书
MySQL索引是啥?不懂就问
2021/07/21 MySQL
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA