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')))
相关推荐
不如语冰17 分钟前
AI大模型入门-pytorch-张量2 tensor创建
python
NPE~29 分钟前
[AI]Agent开发——ADK框架使用
人工智能·python·ai·教程·adk·agent开发
矮个史蒂芬31 分钟前
统计verilog .v文件中output 的bit数
python
gwf2161 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
爱吃提升1 小时前
python 分布式爬虫、爬虫合规与综合实战项目
分布式·爬虫·python
审小匠OpenCPAi1 小时前
银行流水核查怎么自动化?单边匹配、双向勾稽与图聚类异常检测的工程对比
java·前端·人工智能·python·审计
元Y亨H2 小时前
Pandas 解析 Excel 导致的内存溢出(MemoryError)
python·excel
金銀銅鐵3 小时前
[Python] 用 turtle 来绘制瑞典国旗
python
Albert Edison3 小时前
【GUI 自动化测试】Pywinauto 常见操作
自动化测试·python·pywinauto
海兰3 小时前
【高速缓存】RedisVL为文本生成嵌入向量实践指南
人工智能·python·机器学习