欢迎大家来到IT世界,在知识的湖畔探索吧!
欢迎大家来到IT世界,在知识的湖畔探索吧!
今天我们来聊聊Python里最常用的功能之一——排序。
你有没有遇到过这样的问题:
- 一堆数据怎么快速排序?
- 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]
欢迎大家来到IT世界,在知识的湖畔探索吧!
怎么选?
- 如果想保留原数据,用sorted()。
- 如果不关心原数据,用sort()(更快,省内存)。
2. 进阶玩法:自定义排序规则
Python的排序最强大的地方在于——你可以告诉它怎么排!
按字符串长度排序
欢迎大家来到IT世界,在知识的湖畔探索吧!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代码:
欢迎大家来到IT世界,在知识的湖畔探索吧!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)(和快速排序一样快)
- 稳定排序(相同元素不会乱序)
适用场景:
- 小数据 → 插入排序(快)
- 大数据 → 归并排序(稳定)
5. 总结
|
功能 |
代码示例 |
适用场景 |
|
基本排序 |
sorted(nums) |
简单升序排序 |
|
降序排序 |
sorted(nums, reverse=True) |
从大到小 |
|
自定义排序 |
key=lambda x: len(x) |
按字符串长度等 |
|
多级排序 |
key=lambda x: (-总分, -语文, 学号) |
复杂规则排序 |
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/133865.html