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')))
相关推荐
2501_947575802 小时前
计算机毕业设计之jsp开山车行二手车交易系统
java·开发语言·hadoop·python·信息可视化·django·课程设计
Byron__3 小时前
AI学习_06_短期记忆与长期记忆
人工智能·python·学习
取经蜗牛4 小时前
Python 第一阶段完全指南:从零到第一个实用工具
开发语言·python
创世宇图4 小时前
【Python工程化实战】OpenTelemetry 在 Python 中的全链路追踪落地:从埋点到可视化的完整实战指南
python·分布式链路追踪·性能监控·opentelemetry·微服务可观测性
许彰午5 小时前
72_Python爬虫基础BeautifulSoup
爬虫·python·beautifulsoup
zhanghongyi_cpp6 小时前
10. 实验书3.4.2 筛选达到预警阈值的病虫害数据
python
tuddy7894646 小时前
Codex++ 安全边界探秘:从模型能力到风险防御
人工智能·python·安全
C++、Java和Python的菜鸟6 小时前
第1章 集合高级
java·jvm·python
第六五6 小时前
Python 内置装饰器
开发语言·python
梦帮科技6 小时前
UE5 GAS 实战:用 Gameplay Ability System 搭建「赛博修真」境界与技能体系
c++·人工智能·python·ue5·c#