大数跨境
0
0

Python 排序神器:sort () 与 sorted () 的全面解析,从入门到精通

Python 排序神器:sort () 与 sorted () 的全面解析,从入门到精通 码途钥匙
2025-10-17
2



Python 编程中,排序是最常用的操作之一。无论是处理数据列表、清洗用户信息,还是分析统计结果,都离不开高效的排序工具。而sort()和sorted()作为 Python 内置的排序函数,常常让初学者混淆 —— 它们功能相似,用法却有关键区别。今天这篇文章,我们就从基础到进阶,彻底搞懂这两个 “排序好帮手” 的用法,让你在实际开发中不再踩坑。

一、先搞懂基础:两者的核心差异

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


举个最简单的例子,帮你直观感受:

# 测试sort()my_list = [312]result = my_list.sort()  # 对原列表排序print("原列表:", my_list)  # 输出:原列表: [1, 2, 3](原列表已被修改)print("返回值:", result)   # 输出:返回值: None(无返回值)# 测试sorted()my_tuple = (312)  # 用元组(不可变对象)测试result = sorted(my_tuple)  # 对元组排序,创建新列表print("原元组:", my_tuple)  # 输出:原元组: (3, 1, 2)(原对象未变)print("返回值:", result)   # 输出:返回值: [1, 2, 3](返回新列表)


记住这个核心区别:需要修改原列表用 sort (),需要保留原数据用 sorted ()

二、基础用法:3 分钟上手排序

无论是sort()还是sorted(),默认都按 “升序” 排序,用法非常简洁。我们分场景讲解基础用法:

1. 对列表排序(最常用场景)

如果你的数据是列表,两种方法都能使用,根据是否需要保留原列表选择:

# 场景1:不需要保留原列表,用sort()(更节省内存)scores = [8592789588]scores.sort()  # 原地升序排序print("排序后:", scores)  # 输出:排序后: [78, 85, 88, 92, 95]# 场景2:需要保留原列表,用sorted()scores = [8592789588]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 = (524)print(sorted(my_tuple))  # 输出:[245](返回列表)# 对字符串排序(按字符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 = [3, 1, 2]nums.sort(reverse=True)print(nums)  # 输出:[321]# sorted()倒序nums = [3, 1, 2]print(sorted(nums, reverse=True))  # 输出:[321]

2. 按指定规则排序(key 参数)

key参数是排序的 “灵魂”,它允许我们传入一个函数,用函数的返回值作为 “排序依据”。比如按字符串长度排序、按字典的 “值” 排序、按对象的某个属性排序等。

案例 1:按字符串长度排序

如果要对列表中的字符串按 “长度” 排序(而非默认的字母顺序),可以用len函数作为key:

words = ["apple""banana""cherry""date"]# 按字符串长度升序排序sorted_words = sorted(words, key=len)print(sorted_words)  # 输出:['date''apple''banana''cherry'](长度:4566

案例 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("小明"1585),Student("小红"1492),Student("小刚"1678)]# 按“成绩”降序排序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


四、实战场景:该用 sort () 还是 sorted ()?


学完基础和进阶用法,我们结合实际开发场景,帮你快速判断该用哪个函数:

场景 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 = [8592789588]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 = {5241}sorted_set = sorted(my_set)print(sorted_set)  # 输出:[1245]


五、常见误区:这些坑别踩!


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()需要参数。

总结:一张表搞定选择困难

image.png

掌握了sort()和sorted()的区别与用法,你在处理 Python 排序问题时会更加得心应手。下次遇到排序需求,先想清楚 “是否需要保留原数据”,再选择对应的函数,就能避免 90% 的错误啦!

如果这篇文章对你有帮助,欢迎点赞、在看,也可以分享给身边正在学 Python 的朋友~ 有其他 Python 疑问,也可以在评论区留言,我们一起讨论!

这款收获无数好评的终生学习小程序:码途钥匙

2025 全方位 Python 工程师与 AI 算法专业班,课程规划细致又全面!从 Python 基础筑牢根基,到全栈开发、高级框架的深度钻研,再到 AI 算法与数据分析的前沿探秘,每个阶段都干货满满。无论是想入门 Python,还是进阶从事 AI 相关工作,在这里都能找到适配的内容。而且还有配套的课程资源、公开课以及海量题库,助力大家在 IT 学习之路上稳步迈进~


【声明】内容源于网络
0
0
码途钥匙
欢迎来到 Python 学习乐园!这里充满活力,分享前沿实用知识技术。新手或开发者,都能找到价值。一起在这个平台,以 Python 为引,开启成长之旅,探索代码世界,共同进步。携手 Python,共赴精彩未来,快来加入我们吧!
内容 992
粉丝 0
码途钥匙 欢迎来到 Python 学习乐园!这里充满活力,分享前沿实用知识技术。新手或开发者,都能找到价值。一起在这个平台,以 Python 为引,开启成长之旅,探索代码世界,共同进步。携手 Python,共赴精彩未来,快来加入我们吧!
总阅读285
粉丝0
内容992