Python中sort()与sorted()的区别及key参数详解
本文深入解析Python中list内置sort()方法与全局sorted()函数的核心区别,重点讲解从Python2.4开始引入的key参数用法。通过元组、字典及对象排序实例,说明如何指定比较函数以优化排序性能,并区分大小写排序等高级技巧,帮助开发者掌握高效排序策略。
Python列表内置的sort()方法用于对列表进行原地排序,同时Python也提供了全局函数sorted(),可对任何可迭代序列进行排序并返回一个新的已排序序列。
一、基础排序示例
1. 使用sort()方法进行排序
my_list = [3, 5, 1, 4, 2] my_list.sort() print (my_list) #输出: [1, 2, 3, 4, 5]
调用sort()方法会对原列表进行直接修改,该方法不会返回新的列表对象。
需要注意的是,sort()方法仅适用于列表,不能直接用于字典(dict)的排序操作。
2. 使用sorted()函数进行排序
my_list = [3, 5, 1, 4, 2]
result = sorted(my_list)
print (result)
#输出: [1, 2, 3, 4, 5]
my_dict = {"a":"1", "c":"3", "b":"2"}
result = sorted(my_dict)
print (result)
#输出: ['a', 'b', 'c']
sorted()函数会生成并返回一个新的列表或字典对象。对于字典进行排序时,默认依据字典的键(key)值进行排序,最终返回的结果是一个按键值排序后的列表。
二、key参数的应用
自Python 2.4版本起,list.sort()方法和sorted()函数均增加了key参数,允许用户指定一个函数,该函数将在元素比较之前被调用以生成用于比较的值。
key参数的值应为一个接收单个参数并返回一个用于比较值的函数。这种设计效率较高,因为key指定的函数会精确地对每个元素调用一次,避免重复计算。
1. 复杂元组的排序示例
student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
result = sorted(student_tuples, key=lambda student: student[2])
print (result)
#输出 [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
上述示例显示排序依据是元组中的第三个元素(如10、12、15),因为函数lambda student:student[2]返回的值分别为10、12、15。
因此,排序过程实际是基于函数返回的值进行比较,即比较key=15、key=12和key=10的结果,从而确定最终顺序。
lambda student:student[2] 等价于 def f(student): return student[2]
2. 根据字典值(value)进行排序
默认情况下,sorted()对字典按键(key)排序。若需根据字典的值(value)进行排序,则必须显式指定key参数。
my_dict = {"a":"2", "c":"5", "b":"1"}
result = sorted(my_dict)
print (result)
#默认对dict排序,不指定key参数,会默认对dict的key值进行比较排序
#result输出: ['a', 'b', 'c']
result2 = sorted(my_dict, key=lambda x:my_dict[x])
print (result2)
#指定key参数,根据dict的value排序
#result2输出:['b', 'a', 'c']
扩展用法说明:
1. Key Function(键函数):
从Python 2.4版本开始,list.sort()和sorted()均引入了‘key’参数,用于在比较前指定对每个列表元素调用的函数。
具体示例如下:
区分大小写的字符串比较排序场景:
>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
key参数应是一个接收单个参数并返回用于排序依据值的函数。其执行效率较高,因为对于输入记录,key函数能够被准确且仅调用一次。
对于复杂对象,可以使用对象的索引或属性作为key。
例如:
>>> student_tuples = [
... ('john', 'A', 15),
... ('jane', 'B', 12),
... ('dave', 'B', 10),
... ]
>>> sorted(student_tuples, key=lambda student: student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
使用对象属性进行排序操作:
例如:
>>> class Student:
... def __init__(self, name, grade, age):
... self.name = name
... self.grade = grade
... self.age = age
... def __repr__(self):
... return repr((self.name, self.grade, self.age))
>>>
>>> student_objects = [
... Student('john', 'A', 15),
... Student('jane', 'B', 12),
... Student('dave', 'B', 10),
... ]
>>> sorted(student_objects, key=lambda student: student.age) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
总结
以上内容介绍了Python中sort()与sorted()的主要区别及key参数的使用方法,希望能为读者提供帮助。如有任何疑问,欢迎留言交流,小编将及时回复。感谢大家对本站的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













