Python之 sorted() 函数的基本语法

sorted() 函数的基本语法

python 复制代码
sorted(iterable, key=None, reverse=False)
  • iterable: 要排序的可迭代对象(列表、元组、字符串等)

  • key: 可选,指定排序的依据函数

  • reverse: 可选,True 为降序,False 为升序(默认)

基本用法

简单排序

python 复制代码
# 数字排序
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
print(sorted(numbers))  
# 输出: [1, 1, 2, 3, 4, 5, 6, 9]

# 字符串排序
names = ['Alice', 'Bob', 'Charlie', 'David']
print(sorted(names))  
# 输出: ['Alice', 'Bob', 'Charlie', 'David']

# 字符排序
chars = ['z', 'a', 'x', 'b']
print(sorted(chars))  
# 输出: ['a', 'b', 'x', 'z']

降序排序

python 复制代码
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
print(sorted(numbers, reverse=True))  # 输出: [9, 6, 5, 4, 3, 2, 1, 1]

示例解析

python 复制代码
traveler_ids = [('USA', '31195855'), ('BRA', 'CE342567'), ('ESP', 'XDA205856')]
for passport in sorted(traveler_ids):
    print('%s/%s' % passport)

# 输出:
# BRA/CE342567
# ESP/XDA205856  
# USA/31195855

解析: 对于元组列表,sorted() 默认按第一个元素排序,如果第一个元素相同,则按第二个元素排序,以此类推。

使用 key 参数进行自定义排序

按字符串长度排序

python 复制代码
words = ['python', 'java', 'javascript', 'go', 'rust']
print(sorted(words, key=len))  
# 输出: ['go', 'java', 'rust', 'python', 'javascript']

按照绝对值排序

python 复制代码
numbers = [-5, -1, 0, 1, 3, -2]
print(sorted(numbers, key=abs))  
# 输出: [0, -1, 1, -2, 3, -5]

按照元祖的特定循序排序

python 复制代码
# 按第二个元素排序
students = [('Alice', 85), ('Bob', 92), ('Charlie', 78)]
print(sorted(students, key=lambda x: x[1]))  # 输出: [('Charlie', 78), ('Alice', 85), ('Bob', 92)]

# 按第一个元素的长度排序
traveler_ids = [('USA', '31195855'), ('BRA', 'CE342567'), ('ESP', 'XDA205856')]
print(sorted(traveler_ids, key=lambda x: len(x[0])))  # 输出: [('USA', '31195855'), ('BRA', 'CE342567'), ('ESP', 'XDA205856')]

复杂排序示例

多级排序

python 复制代码
# 先按年龄排序,年龄相同时按姓名排序
people = [
    ('Alice', 25, 'Engineer'),
    ('Bob', 30, 'Doctor'),
    ('Charlie', 25, 'Teacher'),
    ('David', 30, 'Engineer')
]

# 按年龄升序,然后按姓名升序
sorted_people = sorted(people, key=lambda x: (x[1], x[0]))
print(sorted_people)
# 输出: [('Alice', 25, 'Engineer'), ('Charlie', 25, 'Teacher'), ('Bob', 30, 'Doctor'), ('David', 30, 'Engineer')]

字符串忽略大小写排序

python 复制代码
names = ['alice', 'Bob', 'CHARLIE', 'david']
print(sorted(names))  
# 输出: ['CHARLIE', 'Bob', 'alice', 'david'] (按ASCII码)
print(sorted(names, key=str.lower))  
# 输出: ['alice', 'Bob', 'CHARLIE', 'david'] (忽略大小写)

自定义排序规则

python 复制代码
def custom_sort_key(item):
    """自定义排序:数字优先,然后按字母顺序"""
    if item.isdigit():
        return (0, int(item))  # 数字类型,按数值排序
    else:
        return (1, item.lower())  # 字母类型,按字母顺序

data = ['z', '10', 'a', '2', 'B', '1']
print(sorted(data, key=custom_sort_key))  # 输出: ['1', '2', '10', 'a', 'B', 'z']

排序复杂数据结构

字典列表排序

python 复制代码
students = [
    {'name': 'Alice', 'grade': 85, 'age': 20},
    {'name': 'Bob', 'grade': 92, 'age': 19},
    {'name': 'Charlie', 'grade': 78, 'age': 21}
]

# 按成绩排序
print(sorted(students, key=lambda x: x['grade']))
# 按年龄排序
print(sorted(students, key=lambda x: x['age']))
# 按姓名排序
print(sorted(students, key=lambda x: x['name']))

使用 operator 模块

python 复制代码
from operator import itemgetter, attrgetter

# 对字典列表排序
students = [
    {'name': 'Alice', 'grade': 85},
    {'name': 'Bob', 'grade': 92},
    {'name': 'Charlie', 'grade': 78}
]

# 使用 itemgetter 替代 lambda
print(sorted(students, key=itemgetter('grade')))
# 等同于: sorted(students, key=lambda x: x['grade'])

# 多字段排序
print(sorted(students, key=itemgetter('grade', 'name')))
相关推荐
IVEN_2 小时前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈
Ray Liang4 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
AI攻城狮4 小时前
如何给 AI Agent 做"断舍离":OpenClaw Session 自动清理实践
python
千寻girling4 小时前
一份不可多得的 《 Python 》语言教程
人工智能·后端·python
AI攻城狮7 小时前
用 Playwright 实现博客一键发布到稀土掘金
python·自动化运维
曲幽7 小时前
FastAPI分布式系统实战:拆解分布式系统中常见问题及解决方案
redis·python·fastapi·web·httpx·lock·asyncio
孟健1 天前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
码路飞1 天前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
曲幽1 天前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers