Python——排序

排序

一、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}]

🔥 四者对比

  1. sorted() → 不修改原数据,返回新列表,最常用、最安全
  2. list.sort() → 原地修改,速度更快
  3. quick_sort() → 面试手写专用
  4. 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。
相关推荐
落羽的落羽2 小时前
【算法札记】练习 | Week1
linux·服务器·c++·人工智能·python·算法·机器学习
计算机徐师兄2 小时前
Python基于深度学习的图片智能分类系统(附源码,文档说明)
python·深度学习·图片智能分类系统·python图片智能分类系统·汽车分类·汽车图片智能分类系统·python汽车智能分类系统
c++圈来了个新人2 小时前
C++类和对象(上)
c语言·开发语言·数据结构·c++·考研
xyq20242 小时前
SQL CREATE INDEX
开发语言
Дерек的学习记录2 小时前
Unreal Eangie 5:蓝图编程
开发语言·学习·ue5
人工干智能2 小时前
科普:Manim 的显示范围问题
python
索西引擎2 小时前
项目级 python 包管理工具 UV
python·uv
添尹2 小时前
Go语言基础之指针
开发语言·后端·golang
2401_827499992 小时前
python项目实战10-网络机器人01
开发语言·python