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')))
相关推荐
PieroPc10 分钟前
用Python Streamlit Sqlite3 写一个简单商品管理系统
数据库·python·sqlite·streamlit
小白银子11 分钟前
零基础从头教学Linux(Day 55)
java·linux·服务器·python
程序员小远14 分钟前
Appium+python+unittest搭建UI自动化框架
自动化测试·软件测试·python·测试工具·ui·appium·测试用例
MavenTalk34 分钟前
如何根据不同的场景选择YOLO相应的基座模型
python·yolo·yolo11n·yolo11m·yolo11s·yolo11x
神奇的代码在哪里36 分钟前
使用python开发任天堂gameboy模拟器|pyboy开发实践
python·宝可梦·pyboy·gameboy模拟器·任天堂掌机模拟器
坚持就完事了1 小时前
正则表达式与Python的re模块
python·正则表达式
Alex艾力的IT数字空间1 小时前
基于PyTorch和CuPy的GPU并行化遗传算法实现
数据结构·人工智能·pytorch·python·深度学习·算法·机器学习
keerduoba1 小时前
EWCCTF2025 Tacticool Bin wp
python
a2006380122 小时前
ply(python版本的flex/bison or Lex/Yacc)
python
wokaoyan19812 小时前
逻辑推演题——谁是骗子
python