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和OpenCV库将URL转换为OpenCV格式的方法
Mar 27 Python
在Python的Flask框架下使用sqlalchemy库的简单教程
Apr 09 Python
基于python yield机制的异步操作同步化编程模型
Mar 18 Python
Python用Bottle轻量级框架进行Web开发
Jun 08 Python
Python使用poplib模块和smtplib模块收发电子邮件的教程
Jul 02 Python
利用Python实现图书超期提醒
Aug 02 Python
python3+PyQt5实现自定义分数滑块部件
Apr 24 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
Nov 06 Python
Python多线程应用于自动化测试操作示例
Dec 06 Python
python pygame实现挡板弹球游戏
Nov 25 Python
详解python变量与数据类型
Aug 25 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 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
Codeigniter中mkdir创建目录遇到权限问题和解决方法
2014/07/25 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
php读取XML的常见方法实例总结
2017/04/25 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
Javascript实现CheckBox的全选与取消全选的代码
2010/07/20 Javascript
33个优秀的 jQuery 图片展示插件分享
2012/03/14 Javascript
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
深入理解jQuery.data() 的实现方式
2016/11/30 Javascript
div实现自适应高度的textarea实现angular双向绑定
2017/01/08 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
Vuex的各个模块封装的实现
2020/06/05 Javascript
Node.js path模块,获取文件后缀名操作
2020/11/07 Javascript
[01:23]一分钟告诉你 DOTA2为什么叫信仰2
2014/06/20 DOTA
python安装mysql-python简明笔记(ubuntu环境)
2016/06/25 Python
Python提取网页中超链接的方法
2016/09/18 Python
Python实现的个人所得税计算器示例
2018/06/01 Python
python处理“
2019/06/10 Python
pandas的相关系数与协方差实例
2019/12/27 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
python实现人机五子棋
2020/03/25 Python
python如何绘制疫情图
2020/09/16 Python
Python爬虫之Selenium警告框(弹窗)处理
2020/12/04 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
德国咖啡批发商:Coffeefair
2019/08/26 全球购物
白酒业务员岗位职责
2013/12/27 职场文书
资产运营委托书范本
2014/10/16 职场文书
2014年计划生育工作总结
2014/11/14 职场文书
深度学习小工程练习之垃圾分类详解
2021/04/14 Python
Redis 配置文件重要属性的具体使用
2021/05/20 Redis
Python实现排序方法常见的四种
2021/07/15 Python
redis复制有可能碰到的问题汇总
2022/04/03 Redis
《杜鹃的婚约》OP主题曲「凸凹」无字幕影像公开
2022/04/08 日漫
Python的property属性详细讲解
2022/04/11 Python