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

Python List排序完全指南:方法与实例详解 | Python排序教程

Python List排序完全指南

掌握sort()方法与sorted()函数的全面使用技巧

Python列表排序基础

Python提供了两种主要的排序方法:

  • list.sort() - 原地排序(修改原始列表)
  • sorted() - 返回新的排序列表(不修改原始列表)

sort()方法

# 基本用法
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
numbers.sort()
print(numbers)  # 输出: [1, 1, 2, 3, 4, 5, 6, 9]

# 降序排序
numbers.sort(reverse=True)
print(numbers)  # 输出: [9, 6, 5, 4, 3, 2, 1, 1]

sorted()函数

# 基本用法
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_numbers = sorted(numbers)
print(sorted_numbers)  # 输出: [1, 1, 2, 3, 4, 5, 6, 9]
print(numbers)         # 输出: [3, 1, 4, 1, 5, 9, 2, 6] (原列表未改变)

# 降序排序
sorted_numbers_desc = sorted(numbers, reverse=True)
print(sorted_numbers_desc)  # 输出: [9, 6, 5, 4, 3, 2, 1, 1]

自定义排序规则

使用key参数可以自定义排序规则:

按字符串长度排序

fruits = ["apple", "banana", "cherry", "date", "elderberry"]
fruits.sort(key=len)
print(fruits)  # 输出: ['date', 'apple', 'banana', 'cherry', 'elderberry']

按自定义函数排序

# 按绝对值排序
numbers = [-5, 3, -2, 8, -1]
numbers.sort(key=abs)
print(numbers)  # 输出: [-1, -2, 3, -5, 8]

# 按字符串的第二个字符排序
words = ["banana", "apple", "cherry", "date"]
sorted_words = sorted(words, key=lambda x: x[1])
print(sorted_words)  # 输出: ['date', 'banana', 'apple', 'cherry']

复杂对象排序

在实际应用中,我们经常需要对包含复杂对象(如字典)的列表进行排序:

字典列表排序

students = [
    {"name": "Alice", "age": 20, "grade": 88},
    {"name": "Bob", "age": 22, "grade": 92},
    {"name": "Charlie", "age": 19, "grade": 85}
]

# 按年龄排序
students_sorted_by_age = sorted(students, key=lambda s: s['age'])
print(students_sorted_by_age)
# 输出: [{'name': 'Charlie', 'age': 19, 'grade': 85}, 
#        {'name': 'Alice', 'age': 20, 'grade': 88}, 
#        {'name': 'Bob', 'age': 22, 'grade': 92}]

# 按成绩降序排序
students.sort(key=lambda s: s['grade'], reverse=True)
print(students)
# 输出: [{'name': 'Bob', 'age': 22, 'grade': 92}, 
#        {'name': 'Alice', 'age': 20, 'grade': 88}, 
#        {'name': 'Charlie', 'age': 19, 'grade': 85}]

多级排序

# 先按成绩降序,再按年龄升序
students = [
    {"name": "Alice", "age": 20, "grade": 88},
    {"name": "Bob", "age": 22, "grade": 92},
    {"name": "Charlie", "age": 19, "grade": 88},
    {"name": "David", "age": 21, "grade": 92}
]

students_sorted = sorted(students, key=lambda s: (-s['grade'], s['age']))
for student in students_sorted:
    print(f"{student['name']} - Age: {student['age']}, Grade: {student['grade']}")
    
# 输出:
# Bob - Age: 22, Grade: 92
# David - Age: 21, Grade: 92
# Alice - Age: 20, Grade: 88
# Charlie - Age: 19, Grade: 88

高级排序技巧

使用operator模块

import operator

# 按字典的值排序
students = [
    {"name": "Alice", "age": 20, "grade": 88},
    {"name": "Bob", "age": 22, "grade": 92},
    {"name": "Charlie", "age": 19, "grade": 85}
]

# 按年龄排序
students.sort(key=operator.itemgetter('age'))
print(students)

# 多级排序:先按成绩,再按年龄
students.sort(key=operator.itemgetter('grade', 'age'))
print(students)

自定义排序类

class Product:
    def __init__(self, name, price, rating):
        self.name = name
        self.price = price
        self.rating = rating
        
    def __repr__(self):
        return f"Product('{self.name}', {self.price}, {self.rating})"

products = [
    Product("Laptop", 1200, 4.5),
    Product("Phone", 800, 4.2),
    Product("Tablet", 600, 4.7),
    Product("Monitor", 300, 4.3)
]

# 按价格排序
products.sort(key=lambda p: p.price)
print(products)

# 按评分降序排序
products.sort(key=lambda p: p.rating, reverse=True)
print(products)

排序算法性能与注意事项

重要注意事项

  • Python的排序算法是Timsort,一种混合稳定排序算法
  • 时间复杂度:平均和最坏情况均为O(n log n)
  • sort()方法会改变原始列表,sorted()函数会返回新列表
  • 当对包含不同数据类型的列表排序时,Python 3会抛出TypeError异常
  • 使用key参数比cmp参数更高效(Python 3已移除cmp参数)
  • 对于稳定性要求高的场景,Python排序是稳定的(相等元素的顺序保持不变)

性能优化建议

  • 避免在key函数中进行复杂计算
  • 对于大型数据集,考虑使用内置排序而非自定义算法
  • 如果只需要部分排序结果,可以使用heapq模块
  • 对于已部分排序的数据,Timsort表现尤为高效
  • 当排序键计算成本高时,考虑使用Schwartzian变换(装饰-排序-去装饰)

Python排序方法总结

sort()方法

  • 原地排序(修改原列表)
  • 不返回任何值
  • 适用于不需要保留原列表的情况
  • 语法:list.sort(key=None, reverse=False)

sorted()函数

  • 返回新的排序列表
  • 原列表保持不变
  • 适用于需要保留原列表的情况
  • 语法:sorted(iterable, key=None, reverse=False)

发表评论