摘要:解決按學生年齡排序的實際問題問題定義一個包含姓名性別年齡,需要按年齡給學生排序。輸出按照年齡進行排序好的。思路使用冒泡排序,比較相鄰的學生,如果第一個學生的值比第二個學生的值大,那么就整體交換這兩個元素。
Python解決按學生年齡排序的實際問題
問題:定義一個Class:包含姓名name、性別gender、年齡age,需要按年齡給學生排序。
輸入:包含學生對象的List。
輸出:按照年齡age進行排序好的List。
思路1:使用冒泡排序,比較相鄰的學生,如果第一個學生的age值比第二個學生的age值大,那么就整體交換這兩個元素。持續每次對越來越少的元素重復上面的步驟。一直到沒有任何一對學生需要比較。
思路2:使用Python內建方法sorted()。
(這個問題其實是筆者面試時候手寫的一個實際問題,比較面向小白,我們可以通過這樣一個簡單的問題復習Python的一些基礎知識點)
1. 前期準備 1.1 定義Classclass 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.__age1.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 list2. 開始排序 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 list2.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)]
構建測試用的隨機數據,計算兩種方法的執行時間進行比較~
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
感謝。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/40779.html
摘要:默認參數的坑默認參數的默認值指向的必需時不變對象。舉一個例說明當函數的默認參數默認為一個可變對象時,會出現什么狀況。例如調用函數輸出結果當然,如果已經又一個對象,也可以在傳入時的名前輸入,會自動將拆分成關鍵字參數。 函數就像是一個黑盒子,我們將相關的一些功能打包成一個函數,后續再調用的時候,我們不再關心內部如何實現,而是只關心這個函數需要輸入(Input)什么,需要輸出(Output)...
摘要:這只是我嘗試做的一個簡單的程序,順便復習下語言,希望以后的自己能更加努力,努力跟隨大佬們的腳步。 這只是我嘗試做的一個簡單的程序,順便復習下C語言,希望以后的自己能更加努力,努力跟隨大佬們的腳步。 C語言學生信息管理系統包括以下功能: 1.添加學生信息 2.查詢學生信息 3.修改學生信息 4...
摘要:數據結構實現鏈表簡單介紹鏈表是一種常見的基礎數據結構,是一種線性表,但是并不會按線性的順序存儲數據,而是在每一個節點里存到下一個節點的指針。圖解如下查找通過遍歷鏈表,使用標記是否找到了正在尋找的項。一旦為,就是對包含要刪除的項的節點的引用。 Python數據結構實現—鏈表 1. 簡單介紹 鏈表(Linked list)是一種常見的基礎數據結構,是一種線性表,但是并不會按線性的順序存儲數...
摘要:擠掉了堆中實現了堆排序。你可以用堆排序來查找一個序列中最大的或者最小的幾個元素。除了使用堆排序,中還有排序和,這兩個排序最終生成以列表表示的排序結果,堆排序也是。 這次我們來說說python中的數據結構。當然了,不會講很基礎的內容。 用過python的都知道,python有著與其他語言很不一樣的數據類型,像什么列表、元組、集合、字典之類。這些數據類型造就了python簡單易用同時又很強...
閱讀 3586·2021-11-04 16:06
閱讀 3586·2021-09-09 11:56
閱讀 848·2021-09-01 11:39
閱讀 900·2019-08-29 15:28
閱讀 2295·2019-08-29 15:18
閱讀 834·2019-08-29 13:26
閱讀 3336·2019-08-29 13:22
閱讀 1048·2019-08-29 12:18