Python入門100個實例(43)——按多個字段排序

從本實例學到什麼

  1. 列表排序方法sort()的key參數的用法。
  2. lambda函數用法示例。
  3. 按多個字段排序的做法。

對於列表排序方法sort(),《Python入門100個實例(26)——列表排序
》一文有具體講解。

實例程序

題目描述

求單詞長度
輸入n個單詞,計算每個單詞長度。對單詞長度排序,分行輸出單詞長度及其單詞。

輸入格式:
行1:單詞個數n
分行輸入n個單詞
輸出格式:
分行輸出單詞長度及其單詞。(單詞長度,單詞)用元組表示。長度相同的話,按單詞字典序從小到大排序。

輸入樣例:

5
python
list
set
996
tuple

輸出樣例:
(3, ‘996’)
(3, ‘set’)
(4, ‘list’)
(5, ‘tuple’)
(6, ‘python’)

來源
PTA網站

上述題目的參考答案

n = int(input())
words = [input() for i in range(n)]  #讀入n個單詞。每次讀一行。
len_words = [(len(word), word) for word in words]  #求出每個單詞的長度
len_words.sort(key=lambda word:word[1])  #key參數的設值使得列表按單詞字典序排序
len_words.sort(key=lambda word:word[0])  #key參數的設值使得列表按單詞長度排序
for length, word in len_words:
    print("(%d, '%s')"%(length, word))

知識點講解

  1. 列表排序方法sort()的key參數的用法。
    (1)sort()方法有一個名字爲key的形式參數。從調用函數的參數傳遞角度來看,"key=lambda word:word[1]"這一寫法是關鍵字參數的寫法。這一寫法的作用是向名字爲key的參數傳遞"lambda word:word[1]"這個值(一個匿名函數,下面進行解釋)。
    (2)key參數的實參值須是一個函數。這個函數以列表元素爲輸入參數,返回的結果用於排序期間兩個列表元素之間的比大小操作。
    (3)下面的代碼中,odd_even函數用作key參數的實參值。odd_even函數的輸入參數是n(一個整數),如果整數爲偶數,返回0,是奇數則返回1。
def odd_even(n):
    if n % 2 == 0:
        return 0
    else:
        return 1

ilist = [40, 3, 20, 5, 60, 7]
ilist.sort(key=odd_even)  # odd_even函數用作key參數的實參值
print(ilist)

以上代碼執行後,程序輸出以下內容:

[40, 20, 60, 3, 5, 7]

爲什麼偶數排在前面呢?因爲排序期間,對於元素a, b,真正用於比大小的是odd_even(a)和odd_even(b)的返回值。假設a爲偶數,b爲奇數, 則odd_even(a)返回0,odd_even(b)返回1。0小於1,所以a排在b的前面。

  1. lambda函數的用法。
    (1)lambda函數也叫作匿名函數,就是沒有名字的函數——臨時用一下,就不費心取名了。lambda函數的寫法是: lambda <參數>: 表達式。在"lambda word:word[1]"中,word是參數,word[1]是表達式。表達式的值就是lambda函數的返回值。
    (2)在執行語句"len_words.sort(key=lambda word:word[1])"過程中,列表的元素(對本實例而言,就是(單詞長度, 單詞)組成的元素,例如(6, ‘python’))傳入lambda函數,賦值給word參數。這樣,word的值是列表元素,於是word[1]的值就是元素的第2項,即單詞。這意味着,按單詞排序。因爲單詞是字符串類型的,所以按單詞字典序排序。
    (3)在執行語句"len_words.sort(key=lambda word:word[0])“過程中,列表的元素(對本實例而言,就是(單詞長度, 單詞)組成的元素,例如(6, ‘python’))傳入lambda函數,賦值給word參數。這樣,word的值是列表元素,於是word[0]的值就是元素的第1項,即單詞長度。這意味着,按單詞長度排序。
    (4)在互聯網搜索引擎裏輸入"python lambda函數”,將會搜索到大量解釋lambda函數用法的網文。《python中的lambda函數用法
    》是一篇比較簡潔的博文。

  2. 按多個字段排序。
    (1)多個字段排序的例子1:先按總成績從大到小排序,如果總成績相同,按學號從小到大排序。這裏,我們能想象到,這個例子講的是成績表排序。成績表中,有學生學號,姓名,總成績這些字段(也叫作屬性,或叫做域)。根據排序規則,第一優先的字段的總成績,第二優先的字段是學號。在總成績相同的前提下,按學號排序。
    (2)多個字段排序的例子2:先按書本價格從大到小排序,如果價格相同,按書號從小到大排序。這裏,我們能想象到,書本信息表中,有學生書號,圖書名稱,出版社,出版時間,價格等字段。根據排序規則,第一優先的字段的書本價格,第二優先的字段是書號。在價格相同的前提下,按書號排序。
    (3)本實例的解答使用了按多字段排序,先按單詞長度從小到大排序,如果單詞長度相同,則按單詞的字典序排序。第一優先的字段是單詞長度,第二優先的字段是單詞。
    (4)如何做到按多個字段排序?假設決定順序的字段有兩個,第一優先字段和第二優先字段,Python語言的做法是,先按第二優先字段進行第一輪排序,再按第一優先字段進行第二輪排序。注意:優先級的的字段先排序!
    (5)上一節給出的代碼中,下面兩行代碼完成按多個字段排序的任務。

len_words.sort(key=lambda word:word[1])  #key參數的設值使得列表按單詞字典序排序
len_words.sort(key=lambda word:word[0])  #key參數的設值使得列表按單詞長度排序

上述兩行代碼中的第一行,是按單詞(第二優先字段)進行排序。第二行是按單詞長度(第一優先字段)進行排序。

小結

  1. 列表的sort()方法的key參數傳入函數。該函數用列表元素作爲輸入參數,返回值用於元素之間的比大小(是指排序關係上的大小,不是值本身的大小)。
  2. lambda函數也叫作匿名函數,就是沒有名字的函數。lambda函數的寫法是: lambda <參數>: 表達式。表達式的值就是lambda函數的返回值。
  3. 假設決定順序的字段有兩個,第一優先字段和第二優先字段,Python語言的做法是,先按第二優先字段進行第一輪排序,再按第一優先字段進行第二輪排序。注意:優先級的的字段先排序!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章