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语言的做法是,先按第二优先字段进行第一轮排序,再按第一优先字段进行第二轮排序。注意:优先级的的字段先排序!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章