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。
相关推荐
01漫游者几秒前
JavaScript函数与对象增强知识
开发语言·javascript·ecmascript
IGAn CTOU2 分钟前
Java高级开发进阶教程之系列
java·开发语言
leo825...5 分钟前
Claude Code Skills 清单(本地)
java·python·ai编程
csbysj20208 分钟前
SQL NULL 函数详解
开发语言
其实防守也摸鱼11 分钟前
CTF密码学综合教学指南--第三章
开发语言·网络·python·安全·网络安全·密码学
NGSI vimp11 分钟前
Java进阶——如何查看Java字节码
java·开发语言
A7bert77731 分钟前
【YOLOv8pose部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·python·深度学习·yolo·目标检测
We་ct1 小时前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域
skywalk81631 小时前
在考虑双轨制,即在中文语法的基础上,加上数学公式的支持,这样像很多计算将更加简单方便,就像现在的小学数学课本里面一样,比如:定x=2*x + 1
开发语言
小书房1 小时前
Kotlin的by
android·开发语言·kotlin·委托·by