在学习具体用法前,我们首先要明确sort()和sorted()的本质区别,这是后续灵活运用的关键。简单来说,两者的核心差异集中在是否修改原对象和返回值上,具体对比如下:

举个最简单的例子,帮你直观感受:
# 测试sort()my_list = [3, 1, 2]result = my_list.sort() # 对原列表排序print("原列表:", my_list) # 输出:原列表: [1, 2, 3](原列表已被修改)print("返回值:", result) # 输出:返回值: None(无返回值)# 测试sorted()my_tuple = (3, 1, 2) # 用元组(不可变对象)测试result = sorted(my_tuple) # 对元组排序,创建新列表print("原元组:", my_tuple) # 输出:原元组: (3, 1, 2)(原对象未变)print("返回值:", result) # 输出:返回值: [1, 2, 3](返回新列表)
记住这个核心区别:需要修改原列表用 sort (),需要保留原数据用 sorted ()。
无论是sort()还是sorted(),默认都按 “升序” 排序,用法非常简洁。我们分场景讲解基础用法:
1. 对列表排序(最常用场景)
如果你的数据是列表,两种方法都能使用,根据是否需要保留原列表选择:
# 场景1:不需要保留原列表,用sort()(更节省内存)scores = [85, 92, 78, 95, 88]scores.sort() # 原地升序排序print("排序后:", scores) # 输出:排序后: [78, 85, 88, 92, 95]# 场景2:需要保留原列表,用sorted()scores = [85, 92, 78, 95, 88]sorted_scores = sorted(scores) # 新列表存储排序结果print("原列表:", scores) # 输出:原列表: [85, 92, 78, 95, 88](未变)print("排序后:", sorted_scores) # 输出:排序后: [78, 85, 88, 92, 95]
2. 对其他可迭代对象排序(sorted () 专属)
sorted()的优势在于支持所有可迭代对象,比如元组、字典、字符串等。需要注意的是,无论原对象是什么类型,sorted()的返回值永远是 “列表”:
# 对元组排序my_tuple = (5, 2, 4)print(sorted(my_tuple)) # 输出:[2, 4, 5](返回列表)# 对字符串排序(按字符ASCII码)my_str = "python"print(sorted(my_str)) # 输出:['h', 'n', 'o', 'p', 't', 'y'](返回列表)# 对字典排序(默认按“键”排序,返回键的列表)my_dict = {"b": 2, "a": 1, "c": 3}print(sorted(my_dict)) # 输出:['a', 'b', 'c'](按键排序)
默认的升序排序满足不了所有需求?别担心,sort()和sorted()都支持通过参数自定义排序规则,最常用的是reverse(倒序)和key(指定排序依据)。
1. 倒序排序(reverse 参数)
只需给reverse参数传True,就能实现 “降序” 排序,两种方法用法一致:
# sort()倒序nums =nums.sort(reverse=True)print(nums) # 输出:[3, 2, 1]# sorted()倒序nums =print(sorted(nums, reverse=True)) # 输出:[3, 2, 1]
2. 按指定规则排序(key 参数)
key参数是排序的 “灵魂”,它允许我们传入一个函数,用函数的返回值作为 “排序依据”。比如按字符串长度排序、按字典的 “值” 排序、按对象的某个属性排序等。
案例 1:按字符串长度排序
如果要对列表中的字符串按 “长度” 排序(而非默认的字母顺序),可以用len函数作为key:
words = ["apple", "banana", "cherry", "date"]# 按字符串长度升序排序sorted_words = sorted(words, key=len)print(sorted_words) # 输出:['date', 'apple', 'banana', 'cherry'](长度:4→5→6→6)
案例 2:按字典的 “值” 排序
字典默认按 “键” 排序,若要按 “值” 排序,可通过lambda函数指定key=lambda x: x[1](x[0]是键,x[1]是值):
student_scores = {"小明": 85, "小红": 92, "小刚": 78}# 按值升序排序(返回列表,每个元素是(键,值)元组)sorted_scores = sorted(student_scores.items(), key=lambda x: x[1])print(sorted_scores) # 输出:[('小刚', 78), ('小明', 85), ('小红', 92)]
案例 3:按对象的属性排序
如果列表中是自定义对象(比如学生对象),可以按对象的某个属性(如年龄、成绩)排序:
class Student:def __init__(self, name, age, score):self.name = nameself.age = ageself.score = score# 创建学生对象列表students = [Student("小明", 15, 85),Student("小红", 14, 92),Student("小刚", 16, 78)]# 按“成绩”降序排序sorted_students = sorted(students, key=lambda x: x.score, reverse=True)# 打印结果for s in sorted_students:print(f"{s.name}: 年龄{s.age}, 成绩{s.score}")# 输出:# 小红: 年龄14, 成绩92# 小明: 年龄15, 成绩85# 小刚: 年龄16, 成绩78
学完基础和进阶用法,我们结合实际开发场景,帮你快速判断该用哪个函数:
场景 1:数据清洗后直接使用列表
如果你需要对列表数据清洗(比如删除空值)后直接排序并使用,且不需要保留原始清洗后的列表,用sort()更高效:
# 清洗数据:删除空字符串,再排序data = ["apple", "", "banana", "", "cherry"]clean_data = [x for x in data if x != ""] # 清洗后:["apple", "banana", "cherry"]clean_data.sort() # 直接修改清洗后的列表,节省内存print(clean_data) # 输出:["apple", "banana", "cherry"]
场景 2:需要对比排序前后的数据
如果你需要同时保留原始数据和排序后的数据(比如分析排序对结果的影响),必须用sorted():
# 分析成绩排序前后的差异original_scores = [85, 92, 78, 95, 88]sorted_scores = sorted(original_scores)# 计算排序前后的最高分位置变化original_max_index = original_scores.index(max(original_scores))sorted_max_index = sorted_scores.index(max(sorted_scores))print(f"原始最高分位置: {original_max_index}, 排序后位置: {sorted_max_index}")# 输出:原始最高分位置: 3, 排序后位置: 4
场景 3:对非列表对象排序
如果你的数据是元组、字典、集合等非列表对象,只能用sorted():
# 对集合排序(集合本身无序,排序后返回列表)my_set = {5, 2, 4, 1}sorted_set = sorted(my_set)print(sorted_set) # 输出:[1, 2, 4, 5]
1.误以为 sort () 有返回值
很多初学者会写new_list = my_list.sort(),结果发现new_list是None。记住:sort()无返回值,直接修改原列表,不需要赋值。
2.对不可变对象用 sort ()
元组、字符串是不可变对象,没有sort()方法,强行调用会报错(如my_tuple.sort()),此时必须用sorted()。
3.key 参数传错值
key需要传 “函数对象”(比如key=len),而不是函数调用结果(比如key=len())。后者会直接报错,因为len()需要参数。
总结:一张表搞定选择困难
掌握了sort()和sorted()的区别与用法,你在处理 Python 排序问题时会更加得心应手。下次遇到排序需求,先想清楚 “是否需要保留原数据”,再选择对应的函数,就能避免 90% 的错误啦!
如果这篇文章对你有帮助,欢迎点赞、在看,也可以分享给身边正在学 Python 的朋友~ 有其他 Python 疑问,也可以在评论区留言,我们一起讨论!
这款收获无数好评的终生学习小程序:码途钥匙
2025 全方位 Python 工程师与 AI 算法专业班,课程规划细致又全面!从 Python 基础筑牢根基,到全栈开发、高级框架的深度钻研,再到 AI 算法与数据分析的前沿探秘,每个阶段都干货满满。无论是想入门 Python,还是进阶从事 AI 相关工作,在这里都能找到适配的内容。而且还有配套的课程资源、公开课以及海量题库,助力大家在 IT 学习之路上稳步迈进~

