Python實(shí)現(xiàn)按學(xué)生年齡排序的實(shí)際問題詳解
前言
本文主要給大家了關(guān)于利用Python按學(xué)生年齡排序的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹:
問題:定義一個(gè)Class:包含姓名name、性別gender、年齡age,需要按年齡給學(xué)生排序。
輸入:包含學(xué)生對象的List。
輸出:按照年齡age進(jìn)行排序好的List。
思路1:使用冒泡排序,比較相鄰的學(xué)生,如果第一個(gè)學(xué)生的age值比第二個(gè)學(xué)生的age值大,那么就整體交換這兩個(gè)元素。持續(xù)每次對越來越少的元素重復(fù)上面的步驟。一直到?jīng)]有任何一對學(xué)生需要比較。
思路2:使用Python內(nèi)建方法sorted()。
(這個(gè)問題其實(shí)是筆者面試時(shí)候手寫的一個(gè)實(shí)際問題,比較面向小白,我們可以通過這樣一個(gè)簡單的問題復(fù)習(xí)Python的一些基礎(chǔ)知識點(diǎn))
1. 前期準(zhǔn)備
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 生成包含隨機(jī)學(xué)生對象的List
# 生成包含隨機(jī)學(xué)生對象的list def generateStudent(num): # num為需要生成的測試對象數(shù) 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內(nèi)建方法sorted
配合lambda表達(dá)式使用,非常簡潔,代碼如下:
sorted(list, key=lambda student: student.getAge()) # 將對象的age屬性作為排序的Key
我們在這里補(bǔ)充一下 sorted() 和 lambda表達(dá)式 的相關(guān)知識點(diǎn):
2.2.1 sorted(iterable, *, key=None, reverse=False)
官方文檔
關(guān)于參數(shù)的說明:
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里接收的可以是某一個(gè)指定的函數(shù)(如lambda函數(shù))返回的一個(gè)值,作為指定的比較依據(jù)。
- reverse默認(rèn)是False從小到大排序,設(shè)置為True后可以從大到小。
關(guān)于穩(wěn)定性的說明:
The built-in sorted() function is guaranteed to be stable.
(看到官方文檔的說明中寫道,這個(gè)方法是保證穩(wěn)定的喲?。?/p>
關(guān)于原理:Python內(nèi)置的sorted()方法背后使用的是Timsort算法,當(dāng)數(shù)據(jù)越接近Ordered Data的時(shí)候,時(shí)間復(fù)雜度越接近O(N)。在我們的這個(gè)問題中,年齡屬性是比較符合Ordered Data的。感興趣的可以點(diǎn)擊Timsort查看更多哈!
2.2.2 lambda表達(dá)式
直接看一個(gè)簡單的例子就能明白了~
>>> pairs = [('one',1),('two',2),('three',3),('five',5),('zero',0),('four',4)] >>> sorted(pairs, key=lambda pair: pair[1]) # List中每個(gè)tuple對的排序依據(jù)是tuple中的第2個(gè)值 [('zero', 0), ('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)]
3. 執(zhí)行測試
構(gòu)建測試用的隨機(jī)數(shù)據(jù),計(jì)算兩種方法的執(zhí)行時(shí)間進(jìn)行比較~
if __name__ == '__main__': # list 形式是[('hZDw', 'FeMale', 17)...] list = generateStudent(10000) # 方法1:使用冒泡排序 start_Time1 = time.time() sortStudent(list) end_Time1 = time.time() # 方法1中,使用10000個(gè)測試數(shù)據(jù)的排序時(shí)間是22.243秒以上(非精確) print('%s cost time %s' % ('sortStudent' , end_Time1 - start_Time1)) # 方法2:使用Python內(nèi)建的sorted方法+lambda表達(dá)式 # 由于sorted方法背后使用的timsort方法,當(dāng)數(shù)據(jù)越接近Ordered data的時(shí)候,時(shí)間復(fù)雜度越接近O(N)。 # 在這個(gè)例子里面,年齡屬性是比較接近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))
測試結(jié)果:
使用方法1(冒泡排序),當(dāng)測試數(shù)據(jù)量是10000個(gè)的時(shí)候,排序時(shí)間是22.243秒左右。
使用方法2(內(nèi)建方法),當(dāng)測試數(shù)據(jù)量是1000000個(gè)的時(shí)候,排序時(shí)間的0.575秒左右。
雖然不是很精確,但差別顯然可見啦!
以上。
如有錯(cuò)誤,還望指正~
完整實(shí)現(xiàn)及測試可在Github找到:ActualProblem-Solution
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Python爬蟲解析網(wǎng)頁的4種方式實(shí)例及原理解析
這篇文章主要介紹了Python爬蟲解析網(wǎng)頁的4種方式實(shí)例及原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Python依賴包遷移到斷網(wǎng)環(huán)境操作
這篇文章主要介紹了Python依賴包遷移到斷網(wǎng)環(huán)境操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07Python如何解決secure_filename對中文不支持問題
最近使用到了secure_filename,然后悲劇的發(fā)現(xiàn)中文居然不展示出來,本文就詳細(xì)的介紹一下解決方法,感興趣的可以了解一下2021-07-07Python3.10耙梳加密算法Encryption種類及開發(fā)場景
這篇文章主要為大家介紹了Python3.10加密,各種加密,耙梳加密算法Encryption種類及開發(fā)場景運(yùn)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Python入門教程(三十一)Python的Try和Except
這篇文章主要介紹了Python入門教程(三十一)Python的Try Except,當(dāng)我們調(diào)用Python并發(fā)生錯(cuò)誤或異常時(shí),通常會停止并生成錯(cuò)誤消息,2023-05-05
可以使用try語句處理這些異常,需要的朋友可以參考下Python之日期與時(shí)間處理模塊(date和datetime)
這篇文章主要介紹了Python之日期與時(shí)間處理模塊(date和datetime),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02