排序
- [一、sorted() 函数(推荐)](#一、sorted() 函数(推荐))
- 二、list.sort()
- 三、手写快速排序
- 四、高级用法:按指定条件排序
-
- [1. 按字符串长度](#1. 按字符串长度)
- [2. 按数字绝对值](#2. 按数字绝对值)
- [3. 按对象/字典某个字段(接口/测试数据常用)](#3. 按对象/字典某个字段(接口/测试数据常用))
- [🔥 四者对比](#🔥 四者对比)
- [🔥 常见面试题](#🔥 常见面试题)
一、sorted() 函数(推荐)
最简单、最常用
一行代码搞定排序,不会修改原数据,最安全。
用法
python
sorted(列表)
示例
python
lst = [3, 1, 4, 2, 5]
new_lst = sorted(lst) # 升序
print(new_lst) # [1,2,3,4,5]
# new_lst_reverse = sorted(lst, reverse=True) # 降序
# print(new_lst_reverse) # [5,4,3,2,1]
对字典列表排序(工作超常用)
python
users = [
{"name": "Tom", "age": 20},
{"name": "Li", "age": 24},
{"name": "Jerry", "age": 18}
]
# 按 age 升序
new_user = sorted(users, key=lambda x: x["age"])
print(new_user) # [{'name': 'Jerry', 'age': 18}, {'name': 'Tom', 'age': 20}, {'name': 'Li', 'age': 24}]
# 按 age 降序
# new_user_reverse = sorted(users, key=lambda x: x["age"], reverse=True)
# print(new_user_reverse) # [{'name': 'Li', 'age': 24}, {'name': 'Tom', 'age': 20}, {'name': 'Jerry', 'age': 18}]
二、list.sort()
原地排序,直接改原列表.
用法
python
lst.sort()
示例
python
lst = [3,1,2]
lst.sort() # 升序
print(lst) # [1,2,3]
# lst.sort(reverse=True) # 降序
# print(lst) # [3,2,1]
三、手写快速排序
如果你要面试,必须背这个快排模板,超级简洁。
快速排序代码(Python 最简版)
python
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[0]
left = [x for x in arr[1:] if x <= pivot]
right = [x for x in arr[1:] if x > pivot]
return quick_sort(left) + [pivot] + quick_sort(right) # 返回升序
# return quick_sort(right) + [pivot] + quick_sort(left) # 返回降序
arr = [3, 1, 4, 2, 5]
print(quick_sort(arr)) # [1, 2, 3, 4, 5]
四、高级用法:按指定条件排序
1. 按字符串长度
python
words = ["app", "banana", "test"]
words.sort(key=len) # 升序
print(words) # ['app', 'test', 'banana']
# words.sort(key=len, reverse=True) # 降序
# print(words) # ['banana', 'test', 'app']
2. 按数字绝对值
python
lst = [-3, 1, -2]
lst.sort(key=abs) # 按绝对值升序
print(lst) # [1, -2, -3]
# lst.sort(key=abs, reverse=True) # 按绝对值降序
# print(lst) # [-3, -2, 1]
3. 按对象/字典某个字段(接口/测试数据常用)
python
lst = [{"score": 80}, {"score": 70}, {"score": 90}]
lst.sort(key=lambda x: x["score"]) # 升序
print(lst) # [{'score': 70}, {'score': 80}, {'score': 90}]
# lst.sort(key=lambda x: x["score"], reverse=True) # 降序
# print(lst) # [{'score': 90}, {'score': 80}, {'score': 70}]
🔥 四者对比
- sorted() → 不修改原数据,返回新列表,最常用、最安全
- list.sort() → 原地修改,速度更快
- quick_sort() → 面试手写专用
- key=lambda → 工作中处理复杂数据排序
🔥 常见面试题
sorted()和list.sort()的区别
- sorted(列表):不修改原列表,返回一个新的排好序的列表。
- 列表.sort():原地排序,直接修改原列表,返回 None。
- 工作中优先用 sorted(),更安全。
如何对列表进行升序/降序排序?
可以借助列表的sort函数中的reverse参数,默认是升序,true时为降序
示例:
python
# 升序(默认)
print(sorted([3, 1, 2])) # [1, 2, 3]
# 降序
print(sorted([3, 1, 2], reverse=True)) # [3, 2, 1]
如何对字典列表某个字段排序?
key用来指定按什么规则,如:长度、字段、绝对值借助匿名函数lambda实现
示例:
python
users = [
{"name": "A", "age": 20},
{"name": "B", "age": 18},
{"name": "C", "age": 22}
]
users.sort(key=lambda x: x["age"]) # 升序
print(users) # [{'name': 'B', 'age': 18}, {'name': 'A', 'age': 20}, {'name': 'C', 'age': 22}]
# users.sort(key=lambda x: x["age"], reverse=True) # 降序
# print(users) # [{'name': 'C', 'age': 22}, {'name': 'A', 'age': 20}, {'name': 'B', 'age': 18}]
如何对元祖列表排序?
python
data = [(2, "b"), (1, "a"), (3, "c")]
# list.sort()
data.sort(key=lambda x: x[0])
print(data) # [(1, 'a'), (2, 'b'), (3, 'c')]
data.sort(key=lambda x: x[0], reverse=True)
print(data) # [(3, 'c'), (2, 'b'), (1, 'a')]
# python的内置函数:sorted()
# print(sorted(data, key=lambda x: x[0])) # 升序:[(1, 'a'), (2, 'b'), (3, 'c')]
# print(sorted(data, key=lambda x: x[0], reverse=True)) # 降序:[(3, 'c'), (2, 'b'), (1, 'a')]
排序后会改变元数据吗?那些会?那些不会?
- sorted() → 不会改变原数据,它是Python 内置排序是 Timsort,效率很高,时间复杂度 O (n log n)。
- list.sort() → 会改变原数据
- 工作尽量用 sorted(),避免意外 bug。