程序填空题:sort和sorted - 实验16 数据分析之排序 - 《Python编程基础及应用实验教程》 - 高教社
Python语言里sort和sorted函数都用于排序,但其执行细节有差异。以列表排序为例,sort方法作用于列表本身,会改变列表元素的存储顺序,而sorted不改变原列表,它会返回一个排好序的列表。<br>
大小是一个相对的概念,排序时可以通过key参数指定排序规则函数,指定的函数将作用于iterable(可迭代对象,如列表)的每一个元素上,并根据key函数返回的结果进行排序。当函数返回一个元组时,元素之间的比较就变成元组比较。元组中各分量顺序,代表了关键字比较顺序,也就是多关键字排序。<br>
请将下述程序补充完整并上机调试,使其可以生成期望的排序结果。
<br>
python
#列表students记录了多名学生信息,每名学生包含姓名,成绩,年龄
students = [('John','A',25), ('Mike',"C",19),
('Mike',"B",12), ('Mike','C',18),
('Bom','D',10), ('Mike','D',19)]
stuA = students.copy()
stuA.sort()
print(stuA)
def myKey(x):
return
stuB = sorted(students,key = myKey)
print(stuB)
stuC = sorted(students,key =)
print(stuC)
def myKey2(x):
return
students.sort(key = myKey2)
print(students)
期望的执行结果:
<br>
[('Bom', 'D', 10), ('John', 'A', 25), ('Mike', 'B', 12), ('Mike', 'C', 18), ('Mike', 'C', 19), ('Mike', 'D', 19)]
[('Bom', 'D', 10), ('Mike', 'B', 12), ('John', 'A', 25), ('Mike', 'C', 18), ('Mike', 'C', 19), ('Mike', 'D', 19)]
[('John', 'A', 25), ('Mike', 'B', 12), ('Mike', 'C', 19), ('Mike', 'C', 18), ('Bom', 'D', 10), ('Mike', 'D', 19)]
[('John', 'A', 25), ('Mike', 'C', 19), ('Mike', 'D', 19), ('Mike', 'C', 18), ('Mike', 'B', 12), ('Bom', 'D', 10)]
【解题提示】
* 输出1表明第7行代码对列表stuA按其元素从小到大升序排列。这里元素为一个个元组,按元组大小比较规则可知,此处就是一个多关键字排序。先按姓名升序排,再按表示成绩的字符串的升序排,最后按年龄的升序排列。
* 输出2表明12行代码对students列表按年龄的个位数字的大小进行了排序,并将结果列表赋值给了变量stuB。第11行应该返回实现此功能的关键字。('Mike', 'C', 19)这个元素与元素('Mike', 'D', 19)的个位数字相同,在python语言中,sorted函数的排序是稳定排序,关键字相同的元素保持原始列表中的先后顺序。
* 输出3表明第15行对students列表的排序按成绩由高到低进行(成绩是字符串)。关键字通过lambda函数赋值,lambda函数请参考教材第7章。
* 输出4表明第20行对students列表的排序先按年龄从高到低,再按成绩字符串从低到高(成绩从高到低),再按姓名升序进行。
* myKey2函数的参数x,我们可理解为代表一个元素。返回值应是一个元组,表示是一个多关键字的排序。
* 当多关键字排序时,如果排序规则里有的要求升序,有的要求降序,我们必须将其统一。统一的方式是对数值取相反数,相反数的升序相当于原数据的降序,反之亦然。
答案:
第1空:x[2] % 10
第2空: lambda x :x[1]
第3空:(-x[2],x[1],x[0])
大小是一个相对的概念,排序时可以通过key参数指定排序规则函数,指定的函数将作用于iterable(可迭代对象,如列表)的每一个元素上,并根据key函数返回的结果进行排序。当函数返回一个元组时,元素之间的比较就变成元组比较。元组中各分量顺序,代表了关键字比较顺序,也就是多关键字排序。<br>
请将下述程序补充完整并上机调试,使其可以生成期望的排序结果。
<br>
python
#列表students记录了多名学生信息,每名学生包含姓名,成绩,年龄
students = [('John','A',25), ('Mike',"C",19),
('Mike',"B",12), ('Mike','C',18),
('Bom','D',10), ('Mike','D',19)]
stuA = students.copy()
stuA.sort()
print(stuA)
def myKey(x):
return
stuB = sorted(students,key = myKey)
print(stuB)
stuC = sorted(students,key =)
print(stuC)
def myKey2(x):
return
students.sort(key = myKey2)
print(students)
期望的执行结果:
<br>
[('Bom', 'D', 10), ('John', 'A', 25), ('Mike', 'B', 12), ('Mike', 'C', 18), ('Mike', 'C', 19), ('Mike', 'D', 19)]
[('Bom', 'D', 10), ('Mike', 'B', 12), ('John', 'A', 25), ('Mike', 'C', 18), ('Mike', 'C', 19), ('Mike', 'D', 19)]
[('John', 'A', 25), ('Mike', 'B', 12), ('Mike', 'C', 19), ('Mike', 'C', 18), ('Bom', 'D', 10), ('Mike', 'D', 19)]
[('John', 'A', 25), ('Mike', 'C', 19), ('Mike', 'D', 19), ('Mike', 'C', 18), ('Mike', 'B', 12), ('Bom', 'D', 10)]
【解题提示】
* 输出1表明第7行代码对列表stuA按其元素从小到大升序排列。这里元素为一个个元组,按元组大小比较规则可知,此处就是一个多关键字排序。先按姓名升序排,再按表示成绩的字符串的升序排,最后按年龄的升序排列。
* 输出2表明12行代码对students列表按年龄的个位数字的大小进行了排序,并将结果列表赋值给了变量stuB。第11行应该返回实现此功能的关键字。('Mike', 'C', 19)这个元素与元素('Mike', 'D', 19)的个位数字相同,在python语言中,sorted函数的排序是稳定排序,关键字相同的元素保持原始列表中的先后顺序。
* 输出3表明第15行对students列表的排序按成绩由高到低进行(成绩是字符串)。关键字通过lambda函数赋值,lambda函数请参考教材第7章。
* 输出4表明第20行对students列表的排序先按年龄从高到低,再按成绩字符串从低到高(成绩从高到低),再按姓名升序进行。
* myKey2函数的参数x,我们可理解为代表一个元素。返回值应是一个元组,表示是一个多关键字的排序。
* 当多关键字排序时,如果排序规则里有的要求升序,有的要求降序,我们必须将其统一。统一的方式是对数值取相反数,相反数的升序相当于原数据的降序,反之亦然。
答案:
第1空:x[2] % 10
第2空: lambda x :x[1]
第3空:(-x[2],x[1],x[0])