你有没有遇到过这样的问题:
一堆数据怎么快速排序?
sort()和sorted()有什么区别?
如何实现“先按总分排,再按语文成绩排”这种复杂排序?
别急,今天我们就用最通俗的语言,带你彻底搞懂Python排序!
1. sort() vs sorted():谁才是排序之王?
Python提供了两种排序方式:
list.sort() → 霸道总裁型,直接修改原列表,不返回新列表。
sorted() → 温柔体贴型,返回新列表,不改变原数据。
举个栗子
nums = [3, 1, 4, 2]
# sorted():给你一个新列表,原数据不变
sorted_nums = sorted(nums) # [1, 2, 3, 4]
print(nums) # 还是 [3, 1, 4, 2]
# sort():直接改掉原列表
nums.sort() # nums变成 [1, 2, 3, 4]
print(nums) # [1, 2, 3, 4]
怎么选?
如果想保留原数据,用sorted()。
如果不关心原数据,用sort()(更快,省内存)。
2. 进阶玩法:自定义排序规则
Python的排序最强大的地方在于——你可以告诉它怎么排!
按字符串长度排序
words = ["apple", "banana", "cherry", "date"]
sorted_words = sorted(words, key=lambda x: len(x)) # 按长度升序
# 结果:['date', 'apple', 'banana', 'cherry']
按字典的某个值排序
users = [
{"name": "Alice", "age": 25},
{"name": "Bob", "age": 30},
{"name": "Charlie", "age": 20},
]
# 按年龄升序排序
sorted_users = sorted(users, key=lambda x: x["age"])
# 结果:Charlie(20) → Alice(25) → Bob(30)
3. 终极挑战:多级排序
问题:期末考试成绩出来了,要怎么排?
规则1:按总分从高到低
规则2:如果总分一样,按语文成绩从高到低
规则3:如果总分和语文都一样,按学号从小到大
Python代码:
students = [
[1, 90, 80, 70], # [学号, 语文, 数学, 英语]
[2, 85, 95, 80], # 总分=85+95+80=260
[3, 90, 80, 70], # 总分=90+80+70=240
[4, 80, 70, 90], # 总分=80+70+90=240
]
# 关键代码:lambda魔法!
sorted_students = sorted(
students,
key=lambda x: (-(x[1] + x[2] + x[3]), -x[1], x[0])
)
解释:
-(x[1]+x[2]+x[3]) → 总分降序(加负号)
-x[1] → 语文降序
x[0] → 学号升序
运行结果:
学号2(总分260)→ 学号1(总分240,语文90)→ 学号3(总分240,语文90)→ 学号4(总分240,语文80)
4. 背后的黑科技:Timsort算法
Python的排序之所以快,是因为它用了Timsort算法(混合了归并排序和插入排序):
最优情况:O(n)(数据已经部分有序)
平均情况:O(n log n)(和快速排序一样快)
稳定排序(相同元素不会乱序)
适用场景:
小数据 → 插入排序(快)
大数据 → 归并排序(稳定)
更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。
想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!