Python中sort()与sorted()的区别及key参数详解

橘子海
橘子海
发布时间:2026-10-13 | 6人浏览过
原创

本文深入解析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参数的使用方法,希望能为读者提供帮助。如有任何疑问,欢迎留言交流,小编将及时回复。感谢大家对本站的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表