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')))
相关推荐
Gyoku Mint33 分钟前
深度学习×第4卷:Pytorch实战——她第一次用张量去拟合你的轨迹
人工智能·pytorch·python·深度学习·神经网络·算法·聚类
郭庆汝6 小时前
pytorch、torchvision与python版本对应关系
人工智能·pytorch·python
思则变9 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络10 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
try2find11 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
博观而约取12 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector14 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习14 小时前
Python入门Day2
开发语言·python
Vertira14 小时前
pdf 合并 python实现(已解决)
前端·python·pdf