资讯专栏INFORMATION COLUMN

CodeSalt | Python解决按学生年龄排序的实际问题

yangrd / 2674人阅读

摘要:解决按学生年龄排序的实际问题问题定义一个包含姓名性别年龄,需要按年龄给学生排序。输出按照年龄进行排序好的。思路使用冒泡排序,比较相邻的学生,如果第一个学生的值比第二个学生的值大,那么就整体交换这两个元素。

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
感谢。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40779.html

相关文章

  • python学习笔记-函数参数

    摘要:默认参数的坑默认参数的默认值指向的必需时不变对象。举一个例说明当函数的默认参数默认为一个可变对象时,会出现什么状况。例如调用函数输出结果当然,如果已经又一个对象,也可以在传入时的名前输入,会自动将拆分成关键字参数。 函数就像是一个黑盒子,我们将相关的一些功能打包成一个函数,后续再调用的时候,我们不再关心内部如何实现,而是只关心这个函数需要输入(Input)什么,需要输出(Output)...

    jasperyang 评论0 收藏0
  • 尝试用数组写一个学生信息管理系统

    摘要:这只是我尝试做的一个简单的程序,顺便复习下语言,希望以后的自己能更加努力,努力跟随大佬们的脚步。 这只是我尝试做的一个简单的程序,顺便复习下C语言,希望以后的自己能更加努力,努力跟随大佬们的脚步。 C语言学生信息管理系统包括以下功能: 1.添加学生信息 2.查询学生信息 3.修改学生信息 4...

    wangshijun 评论0 收藏0
  • CodeSalt | Python数据结构实现 — 链表

    摘要:数据结构实现链表简单介绍链表是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针。图解如下查找通过遍历链表,使用标记是否找到了正在寻找的项。一旦为,就是对包含要删除的项的节点的引用。 Python数据结构实现—链表 1. 简单介绍 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数...

    BaronZhang 评论0 收藏0
  • SQL Server操作语句

    摘要:分组的目的是为了细化聚合函数的作用对象。使用子句时,如果在的查询列表中包含聚合函数,则是针对每个组计算出来的一个汇总的值,从而实现对查询结果的分组统计。外连接操作中可以使用子句,子句等 数据查询功能: Select from [where] [Group by ] [having ] [order by ] 学生表(student) showImg(https://segment...

    ZweiZhao 评论0 收藏0
  • Python奇遇记:数据结构窥探

    摘要:挤掉了堆中实现了堆排序。你可以用堆排序来查找一个序列中最大的或者最小的几个元素。除了使用堆排序,中还有排序和,这两个排序最终生成以列表表示的排序结果,堆排序也是。 这次我们来说说python中的数据结构。当然了,不会讲很基础的内容。 用过python的都知道,python有着与其他语言很不一样的数据类型,像什么列表、元组、集合、字典之类。这些数据类型造就了python简单易用同时又很强...

    mrli2016 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<