当前位置:首页 > Python > 正文

Python列表sorted排序完全指南 - 从基础到高级用法

Python列表sorted()排序完全指南

掌握sorted()函数的各种用法,从基本排序到高级自定义排序

sorted()函数基础

Python内置的sorted()函数是列表排序的核心工具,它会返回一个新的已排序列表,而不改变原始列表。

基本语法

sorted(iterable, key=None, reverse=False)
  • iterable - 要排序的可迭代对象(列表、元组等)
  • key - 可选参数,指定排序依据的函数
  • reverse - 可选参数,为True时降序排序,默认为False(升序)

基础排序示例

数字排序

numbers = [5, 2, 9, 1, 7]
sorted_numbers = sorted(numbers)
print(sorted_numbers)  # 输出: [1, 2, 5, 7, 9]

字符串排序

fruits = ['apple', 'Banana', 'cherry', 'date']
sorted_fruits = sorted(fruits)
print(sorted_fruits)  # 输出: ['Banana', 'apple', 'cherry', 'date']

使用key参数自定义排序

key参数是sorted()函数最强大的功能,它允许你指定一个函数来自定义排序逻辑。

常见key函数用法

按字符串长度排序

words = ['apple', 'kiwi', 'banana', 'fig']
sorted_by_length = sorted(words, key=len)
print(sorted_by_length)  # 输出: ['fig', 'kiwi', 'apple', 'banana']

忽略大小写排序

fruits = ['apple', 'Banana', 'cherry', 'Date']
sorted_ignore_case = sorted(fruits, key=str.lower)
print(sorted_ignore_case)  # 输出: ['apple', 'Banana', 'cherry', 'Date']

复杂数据结构排序

按字典值排序

students = [
    {'name': 'Alice', 'grade': 92},
    {'name': 'Bob', 'grade': 87},
    {'name': 'Charlie', 'grade': 95}
]

# 按成绩降序排序
sorted_students = sorted(students, key=lambda x: x['grade'], reverse=True)

for student in sorted_students:
    print(f"{student['name']}: {student['grade']}")

# 输出:
# Charlie: 95
# Alice: 92
# Bob: 87

高级排序技巧

多级排序

当需要按多个条件排序时,可以通过返回元组的方式实现多级排序。

# 员工数据:部门、姓名、薪资
employees = [
    ('HR', 'Alice', 65000),
    ('IT', 'Bob', 85000),
    ('HR', 'Charlie', 72000),
    ('IT', 'David', 80000),
    ('Finance', 'Eva', 90000)
]

# 先按部门升序,再按薪资降序
sorted_employees = sorted(employees, key=lambda x: (x[0], -x[2]))

for emp in sorted_employees:
    print(f"{emp[0]:<8} {emp[1]:<10} ${emp[2]}")
    
# 输出:
# Finance Eva       $90000
# HR      Charlie  $72000
# HR      Alice    $65000
# IT      Bob      $85000
# IT      David    $80000

自定义排序顺序

使用字典映射创建自定义排序顺序。

# 自定义优先级:High > Medium > Low
priority_order = {'High': 0, 'Medium': 1, 'Low': 2}

tasks = [
    {'id': 1, 'priority': 'Medium'},
    {'id': 2, 'priority': 'High'},
    {'id': 3, 'priority': 'Low'},
    {'id': 4, 'priority': 'High'}
]

sorted_tasks = sorted(tasks, key=lambda x: priority_order[x['priority']])

for task in sorted_tasks:
    print(f"Task {task['id']}: {task['priority']}")
    
# 输出:
# Task 2: High
# Task 4: High
# Task 1: Medium
# Task 3: Low

sorted() vs sort()

理解Python中两种排序方式的区别:

特性 sorted() list.sort()
返回新列表 否(原地排序)
原始列表 不变 修改
支持的数据类型 所有可迭代对象 仅列表
使用场景 需要保留原始数据时 不需要原始数据时
# sorted() 示例 - 创建新列表
original = [3, 1, 4, 2]
new_sorted = sorted(original)
print("Original:", original)  # [3, 1, 4, 2]
print("Sorted:", new_sorted)  # [1, 2, 3, 4]

# sort() 示例 - 原地排序
original.sort()
print("After sort():", original)  # [1, 2, 3, 4]

排序算法与性能

Python的sorted()函数使用Timsort算法,这是一种混合排序算法,结合了归并排序和插入排序的优点。

Timsort关键特性:

  • 稳定排序(相等元素的顺序保持不变)
  • 时间复杂度:最好情况O(n),平均和最坏情况O(n log n)
  • 空间复杂度:O(n)
  • 特别适合处理部分有序的数据集
  • 在实际应用中表现优异,被Java、Android和Swift等平台采用

性能优化提示

  1. 对于小型列表(n<100),插入排序部分效率很高
  2. 使用key函数时,尽量选择高效的计算方式
  3. 避免在key函数中执行复杂操作(如数据库查询)
  4. 当需要多次排序时,考虑使用Schwartzian变换(装饰-排序-去装饰)

掌握Python排序,提升编程效率

sorted()函数是Python中最常用的内置函数之一,灵活运用key参数可以解决各种复杂排序需求。

高效 灵活 强大

发表评论