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计算学生平均年龄_CodeSalt | Python解决按学生年龄排序的实际问题相关推荐

  1. 《学习记录》“Python”计算汽车平均油耗及费用

    题目要求: 计算汽车平均油耗及费用.小梅最近的轿车里程表显示百公里的油耗比平常低很多,他怀疑数据不准,想编程序写一个程序,输入加油的钱数,以及加油后的 运行公里数,算出车辆的油耗,再输入一年运行的公里 ...

  2. python计算均方根误差_如何在Python中创建线性回归机器学习模型?「入门篇」

    线性回归和逻辑回归是当今很受欢迎的两种机器学习模型. 本文将教你如何使用 scikit-learn 库在Python中创建.训练和测试你的第一个线性.逻辑回归机器学习模型,本文适合大部分的新人小白. ...

  3. python 计算累计人数_免费Python入门课程,看到就是赚到~

    前言 人生苦短,我用python.当下最火的编程语言,你是否也想试试? Python发行于1991年,广泛应用于系统管理任务的处理和WEB编程.创始人阿姆斯特丹Guido为了打发圣诞节的无趣,决心开发 ...

  4. Python 计算总分数和平均分 - Python零基础入门教程

    目录 一.Python 计算总分数和平均分源码 二.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.Python 计算总分数和平 ...

  5. 如何用python计算圆周率_如何用python计算圆周率?

    如何用python计算圆周率? python计算圆周率的方法: 圆周率没有精确的计算公式,所以只能用近似的方式计算它的近似值. 我们运用蒙特卡罗方法,思路很简单,在下面图形中随机抛置大量的点, 计算落 ...

  6. 如何提高Python计算浮点数的精度(如何解决Python中浮点数计算误差问题)

    我们可以使用decimal模块来提高python中浮点数计算的精度: 1. 导入decimal模块:import decimal 2. 创建一个Decimal对象:a = decimal.Decima ...

  7. python计算两张图片相似度,python 图片相似度匹配

    如何使用python来判断图片相似度 . fromPILimportImageimportos#importhashlibdefgetGray(image_file):tmpls=[]forhinra ...

  8. python计算特征值特征向量_使用Python求解特征值、特征向量及奇异值分解(SVD)...

    SVD也是对矩阵进行分解,但是和特征分解不同,SVD并不要求要分解的矩阵为方阵.假设我们的矩阵A是一个m×n的矩阵,那么我们定义矩阵A的SVD为:A=UΣVT 其中U是一个m×m的矩阵,Σ是一个m×n ...

  9. python计算身体质量指数_利用Python计算身体质量指数BMI来判断体型

    身体质量指数BMI:对身体质量的刻画(Body Mass Index) 国际上常用的衡量人体肥胖和健康程度的重要标准,主要用于统计分析. 定义: 有上图考虑BMI的值的结果因国内和国外的标准不同而不同 ...

最新文章

  1. JavaScript中的递归
  2. 获取当前正在执行的方法的名称
  3. AI研发新药登上Nature子刊:46天合成潜在新药候选分子,比传统方法快15倍 | 开源...
  4. ThinkPHP使用分组详细介绍(十七)
  5. 为什么python画不了图-解决python中使用plot画图,图不显示的问题
  6. MyEclipse Web 项目的图标和右键New菜单
  7. 成功解决Exception “unhandled ImportError“cannot import name ‘imread‘ from ‘scipy.misc‘
  8. 做倒计时一天_不知道这6个管理时间的工具,做不好时间管理
  9. IOS关于键盘的弹出和收起
  10. java j2se1.5_Java教程 用J2SE1.5建立多任务的Java应用程序
  11. “弱肉强食,月半者为王” | OpenDILab推出多智能体博弈环境Go-Bigger
  12. 随风潜入夜,润物细无声
  13. Linux入门——文本处理三剑客之gnu awk
  14. VNC实现Windows远程访问Ubuntu 16.04(无需安装第三方桌面)
  15. 基于Web的代码编辑器 Ace的使用
  16. 程序员的自我修炼——新手如何学好编程
  17. 「数商云专辑」服装/服饰电商平台解决方案
  18. Foxmail登陆gmail设置
  19. java实现多个excel表格数据整合成一个excel表格
  20. android 7.0下载地址,android 7.0 Downloadprovider 下载流程

热门文章

  1. 与《管理幸福》一书作者Jurgen Appelo的访谈
  2. Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结
  3. mybatis 中#与$的区别
  4. 行列式计算的两种方法
  5. 博客园添加访问次数统计
  6. 学习官方示例 - System.TClass
  7. Servlet的Web应用---三种方法获取表单的各种属性(源码)
  8. 日本社交巨头Line推出BCH交易服务,助力比特币现金蓬勃发展
  9. AndroidStudio项目打包成jar
  10. 给初学者的一点建议,新手学习java需要学习哪些基础?