Python sorted() 函数(完整指南)

Python sorted() 函数:排序的优雅之道

在日常编程中,我们常常需要对数据进行排序。无论是处理用户列表、商品价格,还是日志时间戳,排序都是最基础也最常用的操作之一。Python 提供了一个强大而简洁的内置函数——sorted(),它能轻松应对各种排序需求,且不改变原始数据结构。今天,我们就来深入聊聊这个看似简单却功能丰富的函数。

Python sorted() 函数 不仅能对列表排序,还能处理元组、字符串、字典等多种可迭代对象。更重要的是,它返回一个新列表,原数据保持不变,这在数据安全和逻辑清晰方面提供了巨大优势。接下来,我会带你从基础用法到高级技巧,一步步掌握它的精髓。


基础用法:从最简单的排序开始

sorted() 函数的基本语法非常直观:

sorted(iterable, key=None, reverse=False)

其中:

  • iterable 是要排序的可迭代对象(如列表、元组等)
  • key 是一个函数,用于指定排序依据
  • reverse 是布尔值,True 表示降序,False 表示升序(默认)

让我们从一个最简单的例子开始:

numbers = [64, 34, 25, 12, 22, 11, 90]
sorted_numbers = sorted(numbers)

print("原始列表:", numbers)
print("排序后列表:", sorted_numbers)

输出:

原始列表: [64, 34, 25, 12, 22, 11, 90]
排序后列表: [11, 12, 22, 25, 34, 64, 90]

💡 注释sorted() 会创建一个新的排序后列表,原 numbers 列表未被修改。这与 list.sort() 方法不同,后者会直接修改原列表。

你可以用 reverse=True 实现降序排序:

numbers = [64, 34, 25, 12, 22, 11, 90]
descending_numbers = sorted(numbers, reverse=True)

print("降序排序:", descending_numbers)

输出:

降序排序: [90, 64, 34, 25, 22, 12, 11]

排序字符串与元组:不只是数字

Python sorted() 函数 不仅适用于数字,还能处理字符串和元组。对于字符串,它会按字母顺序排序(基于 Unicode 编码):

words = ['banana', 'apple', 'cherry', 'date']
sorted_words = sorted(words)

print("原始单词:", words)
print("排序后:", sorted_words)

输出:

原始单词: ['banana', 'apple', 'cherry', 'date']
排序后: ['apple', 'banana', 'cherry', 'date']

💡 注释:字符串排序是按字典序进行的,即 'a' < 'b' < 'c' ……。注意,大小写敏感,'Z' 会排在 'a' 前面。

对于元组,sorted() 会按第一个元素排序,如果第一个相同,再比较第二个,以此类推:

students = [('Alice', 85), ('Bob', 90), ('Charlie', 78), ('Diana', 90)]
sorted_by_score = sorted(students, key=lambda x: x[1])

print("按分数排序:", sorted_by_score)

输出:

按分数排序: [('Charlie', 78), ('Alice', 85), ('Bob', 90), ('Diana', 90)]

💡 注释:这里使用了 lambda x: x[1] 作为 key 参数,表示以元组的第二个元素(即分数)作为排序依据。lambda 是一个匿名函数,用于简化代码。


使用 key 参数:自定义排序规则

key 参数是 sorted() 函数最强大的部分。它允许你定义“按什么排序”,而不仅仅是“怎么排”。

按字符串长度排序

fruits = ['apple', 'banana', 'kiwi', 'strawberry', 'grape']
sorted_by_length = sorted(fruits, key=len)

print("按长度排序:", sorted_by_length)

输出:

按长度排序: ['kiwi', 'grape', 'apple', 'banana', 'strawberry']

💡 注释len 是内置函数,返回字符串长度。key=len 表示以字符串长度为排序标准。

按字符串大小写忽略排序

默认情况下,大写字母在小写字母之前。如果你想忽略大小写排序,可以使用 str.lower 作为 key:

names = ['Alice', 'bob', 'Charlie', 'diana', 'Eve']
sorted_ignore_case = sorted(names, key=str.lower)

print("忽略大小写排序:", sorted_ignore_case)

输出:

忽略大小写排序: ['Alice', 'bob', 'Charlie', 'diana', 'Eve']

💡 注释str.lower 将每个名字转为小写再比较,从而实现大小写不敏感排序。

按字典值排序(针对字典)

如果你有一个字典,想要按键或值排序,也可以结合 sorted() 使用:

scores = {'Alice': 85, 'Bob': 90, 'Charlie': 78, 'Diana': 90}

sorted_by_key = sorted(scores.keys())
print("按键排序:", sorted_by_key)

sorted_by_value = sorted(scores.items(), key=lambda x: x[1])
print("按值排序:", sorted_by_value)

输出:

按键排序: ['Alice', 'Bob', 'Charlie', 'Diana']
按值排序: [('Charlie', 78), ('Alice', 85), ('Bob', 90), ('Diana', 90)]

💡 注释scores.items() 返回键值对元组,lambda x: x[1] 表示以值(索引 1)为排序依据。


reverse 参数:控制排序方向

reverse 参数可以轻松切换升序和降序。它非常直观,只需设为 True 即可:

ages = [23, 45, 18, 34, 50, 28]
sorted_ascending = sorted(ages)
sorted_descending = sorted(ages, reverse=True)

print("升序:", sorted_ascending)
print("降序:", sorted_descending)

输出:

升序: [18, 23, 28, 34, 45, 50]
降序: [50, 45, 34, 28, 23, 18]

💡 注释reverse=True 等价于反向排序。注意,它会影响整个排序过程,包括 key 的作用顺序。


实际应用案例:处理真实数据

我们来看一个更贴近实际的场景:处理学生成绩单,按成绩降序,成绩相同时按姓名升序。

students_data = [
    ('张三', 88),
    ('李四', 92),
    ('王五', 88),
    ('赵六', 90),
    ('钱七', 92),
    ('孙八', 85)
]

sorted_students = sorted(students_data, key=lambda x: (-x[1], x[0]))

print("排序结果:")
for name, score in sorted_students:
    print(f"{name}: {score}")

输出:

排序结果:
李四: 92
钱七: 92
赵六: 90
张三: 88
王五: 88
孙八: 85

💡 注释-x[1] 表示对成绩取负,这样成绩高的反而在前面(降序)。x[0] 是姓名,用于成绩相同时的次级排序。这种“负数技巧”是处理降序排序的常见做法。


性能与内存:为什么推荐使用 sorted()

在性能上,sorted() 有明显优势。它不修改原数据,避免了意外更改的风险。尤其在处理大型数据集时,这种“函数式”风格更安全、更可预测。

此外,sorted() 支持所有可迭代对象,包括生成器、文件对象等,使用范围远超 list.sort()

特性 sorted() list.sort()
是否修改原列表
返回值 新列表 None
适用对象 任意可迭代对象 仅列表
可链式调用

💡 注释:由于 sorted() 返回新列表,你可以直接赋值或链式使用,比如 sorted(data)[::-1] 获取倒序。


总结与建议

Python sorted() 函数 是一个高度灵活、安全且高效的排序工具。它不仅能满足基础排序需求,还能通过 keyreverse 参数实现复杂逻辑。对于初学者,建议从 sorted(list) 开始,逐步理解 key 的作用;对于中级开发者,掌握 lambda 和多级排序技巧将极大提升代码质量。

记住:排序不是“排个序”那么简单,而是对数据逻辑的表达。Python sorted() 函数 让你用更少的代码,写出更清晰、更安全的逻辑。

在实际项目中,遇到排序问题,不妨先想一想:能不能用 sorted() 解决?答案很可能是“能”。