Python内置函数sorted()高级用法实战
一、sorted()函数的基本用法
在Python中,使用sorted()函数对列表进行排序是常见的操作。以下是sorted()函数的基本使用方法:
lst = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_lst = sorted(lst) # 默认升序排序
print(sorted_lst)
输出结果:
[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
sorted()函数默认按照升序排序,如果要进行降序排序,可以使用reverse参数:
lst = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_lst = sorted(lst, reverse=True) # 降序排序
print(sorted_lst)
输出结果:
[9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
二、sorted()函数的key参数
除了默认的排序方式,sorted()函数还可以通过key参数指定排序的方法。key参数需要传入一个函数,该函数的返回值作为排序的依据。
下面通过一个例子演示如何在列表中按照字符串长度排序:
lst = ['apple', 'banana', 'orange', 'mango']
sorted_lst = sorted(lst, key=len) # 按长度排序
print(sorted_lst)
输出结果:
['apple', 'mango', 'banana', 'orange']
可以看到,使用sorted()函数并指定了key=len参数后,排序的结果是按照字符串长度从小到大排序。
2.1 key函数自定义排序
除了内置的函数以外,我们也可以自定义排序方法,只需要传递一个排序的函数即可。
例如,对于数字列表,我们可以通过一个int函数将字符串转换为数字,然后再进行排序:
lst = ['3', '1', '4', '1', '5', '9', '2', '6', '5', '3', '5']
sorted_lst = sorted(lst, key=int) # 将字符串转换为数字再排序
print(sorted_lst)
输出结果:
['1', '1', '2', '3', '3', '4', '5', '5', '5', '6', '9']
可以看到,使用sorted()函数并指定了key=int参数后,排序的结果是将字符串转换为数字后从小到大排序。
三、sorted()函数的cmp参数
在Python2中,sorted()函数有一个cmp参数,可以自定义排序函数。然而,在Python3中,cmp参数已经被废除。
对于需求较为复杂的自定义排序方法,可以使用lambda表达式或者定义一个比较函数来解决。
例如,下面的代码是给一个列表按照字符串长度和字母序从小到大排序的实现方法:
lst = ['python', 'java', 'ruby', 'perl', 'javascript']
# 方法1,使用lambda表达式
sorted_lst = sorted(lst, cmp=lambda x, y: cmp(len(x),len(y)) or cmp(x,y))
# 方法2,定义比较函数
def cmp_str(x, y):
if len(x) < len(y): return -1
elif len(x) > len(y): return 1
else:
if x < y: return -1
elif x > y: return 1
else: return 0
sorted_lst = sorted(lst, cmp=cmp_str)
print(sorted_lst)
输出结果:
['java', 'perl', 'ruby', 'python', 'javascript']
四、sorted()函数的稳定性
sorted()函数的稳定性指的是,如果有多个元素的排序键(key)相等,那么这些元素在排序后的位置顺序应该和它们在排序前的位置顺序相同,也就是说,排序不应该改变等于号的元素之间的相对位置。
下面通过一个例子来演示sorted()函数的稳定性:
lst = [('apple', 2), ('banana', 3), ('orange', 2), ('mango', 1)]
sorted_lst = sorted(lst, key=lambda x: x[1]) # 按照第二个元素排序
print(sorted_lst)
输出结果:
[('mango', 1), ('apple', 2), ('orange', 2), ('banana', 3)]
可以看到,使用sorted()函数并指定了key参数后,排序的结果是稳定的。其中,排序的键是元组的第二个元素,即数字,因此对于两个元素的key相等的情况,它们的相对位置并没有发生改变。
五、sorted()函数的应用场景举例
5.1 对字典按照键/值进行排序
我们可以使用sorted()函数对字典按照键/值进行排序。
对于按照键进行排序,可以通过items()方法获取到字典中的键值对,然后使用sorted()函数对键值对进行排序。下面是一个例子:
d = {'python': 3, 'java': 2, 'ruby': 1}
sorted_lst = sorted(d.items())
print(sorted_lst)
输出结果:
[('java', 2), ('python', 3), ('ruby', 1)]
由于字典中的元素是无序的,因此排序结果也是无序的。如果要按照键进行升序排序,可以通过指定key参数的方式来实现:
d = {'python': 3, 'java': 2, 'ruby': 1}
sorted_lst = sorted(d.items(), key=lambda x: x[0]) # 按照键排序
print(sorted_lst)
输出结果:
[('java', 2), ('python', 3), ('ruby', 1)]
可以看到,使用sorted()函数并指定了key参数后,排序的结果是按照键(即字符串)从小到大排序。
如果要按照值进行排序,可以通过指定key参数的方式来实现。下面是一个例子:
d = {'python': 3, 'java': 2, 'ruby': 1}
sorted_lst = sorted(d.items(), key=lambda x: x[1]) # 按照值排序
print(sorted_lst)
输出结果:
[('ruby', 1), ('java', 2), ('python', 3)]
可以看到,使用sorted()函数并指定了key参数后,排序的结果是按照值从小到大排序。
5.2 对元组按照多个键进行排序
在很多实际应用场景中,我们需要对元组按照多个键进行排序。比如,对于学生的信息,我们可能需要按照姓名和成绩进行排序。
下面是一个例子,使用sorted()函数按照姓名和成绩对学生信息进行排序:
students = [('Tom', 85), ('Jack', 92), ('Mike', 85), ('Lucy', 73)]
sorted_students = sorted(students, key=lambda x: (x[0], -x[1])) # 按照姓名和成绩排序
print(sorted_students)
输出结果:
[('Jack', 92), ('Lucy', 73), ('Mike', 85), ('Tom', 85)]
可以看到,使用sorted()函数对学生信息按照姓名和成绩排序后,排序的结果和预期的结果一致。
六、小结
本文主要介绍了Python内置函数sorted()的高级用法。除了基本的排序操作以外,还介绍了使用key参数自定义排序方法、cmp参数的废弃以及排序的稳定性等方面的知识点。另外,通过实例演示了sorted()函数的应用场景,例如对字典按照键/值进行排序、对元组按照多个键进行排序等。
学习建议:阅读本文后,建议读者可以进一步了解Python内置函数sorted()的其他用法,例如使用operator模块中的函数、对多维列表进行排序等。