国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實現按學生年齡排序的實際問題詳解

2020-01-04 16:49:48
字體:
來源:轉載
供稿:網友

前言

本文主要給大家了關于利用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

# 生成包含隨機學生對象的listdef 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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁武县| 怀宁县| 渝北区| 太保市| 车险| 鄂州市| 玉林市| 句容市| 银川市| 平邑县| 陆良县| 江油市| 个旧市| 正镶白旗| 图们市| 安丘市| 大丰市| 武川县| 金阳县| 开化县| 祁连县| 临安市| 沈丘县| 乐山市| 苍溪县| 桂林市| 鄂温| 高阳县| 交城县| 菏泽市| 东乌| 金山区| 昌图县| 广丰县| 巴东县| 项城市| 合山市| 临沧市| 马尔康县| 盱眙县| 安义县|