CodeSalt | Python解決按學生年齡排序的實際問題

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

問題:定義一個Class:包含姓名name、性別gender、年齡age,須要按年齡給學生排序。
輸入:包含學生對象的List
輸出:按照年齡age進行排序好的Listgit

思路1:使用冒泡排序,比較相鄰的學生,若是第一個學生的age值比第二個學生的age值大,那麼就總體交換這兩個元素。持續每次對愈來愈少的元素重複上面的步驟。一直到沒有任何一對學生須要比較。
思路2:使用Python內建方法sorted()github

(這個問題實際上是筆者面試時候手寫的一個實際問題,比較面向小白,咱們能夠經過這樣一個簡單的問題複習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表達式使用,很是簡潔,代碼以下:app

sorted(list, key=lambda student: student.getAge()) # 將對象的age屬性做爲排序的Key

咱們在這裏補充一下 sorted()lambda表達式 的相關知識點:dom

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.測試

(看到官方文檔的說明中寫道,這個方法是保證穩定的喲!)ui

  • 關於原理:Python內置的sorted()方法背後使用的是Timsort算法,當數據越接近Ordered Data的時候,時間複雜度越接近O(N)。在咱們的這個問題中,年齡屬性是比較符合Ordered Data的。感興趣的能夠點擊Timsort查看更多哈!

2.2.2 lambda表達式

直接看一個簡單的例子就能明白了~code

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

相關文章
相關標籤/搜索