本文目录导读:

我来分享几个Python数据排序的实用案例,从基础到进阶。
基础排序方法
1 列表排序
# 数字列表排序 numbers = [3, 1, 4, 1, 5, 9, 2, 6] numbers.sort() # 原地排序 print(numbers) # [1, 1, 2, 3, 4, 5, 6, 9] # 不修改原列表 sorted_numbers = sorted([3, 1, 4, 1, 5]) print(sorted_numbers) # [1, 1, 3, 4, 5] # 降序排序 numbers.sort(reverse=True) print(numbers) # [9, 6, 5, 4, 3, 2, 1, 1]
2 字符串排序
fruits = ['banana', 'apple', 'Cherry', 'date'] fruits.sort() # 区分大小写 print(fruits) # ['Cherry', 'apple', 'banana', 'date'] # 忽略大小写排序 fruits.sort(key=str.lower) print(fruits) # ['apple', 'banana', 'Cherry', 'date']
字典排序
1 按键排序
# 按字典键排序
scores = {'Alice': 85, 'Bob': 92, 'Charlie': 78}
# 按键排序
sorted_by_key = dict(sorted(scores.items()))
print(sorted_by_key) # {'Alice': 85, 'Bob': 92, 'Charlie': 78}
# 按值排序
sorted_by_value = dict(sorted(scores.items(), key=lambda x: x[1]))
print(sorted_by_value) # {'Charlie': 78, 'Alice': 85, 'Bob': 92}
# 按值降序
sorted_by_value_desc = dict(sorted(scores.items(),
key=lambda x: x[1],
reverse=True))
print(sorted_by_value_desc) # {'Bob': 92, 'Alice': 85, 'Charlie': 78}
复杂数据结构排序
1 对象列表排序
class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age
def __repr__(self):
return f"{self.name}({self.grade}, {self.age})"
students = [
Student("Alice", 85, 20),
Student("Bob", 92, 19),
Student("Charlie", 78, 21),
Student("David", 92, 18)
]
# 按成绩排序
sorted_by_grade = sorted(students, key=lambda s: s.grade)
print(sorted_by_grade)
# 输出: [Charlie(78, 21), Alice(85, 20), Bob(92, 19), David(92, 18)]
# 多级排序:先成绩降序,再年龄升序
sorted_multi = sorted(students,
key=lambda s: (-s.grade, s.age))
print(sorted_multi)
# 输出: [David(92, 18), Bob(92, 19), Alice(85, 20), Charlie(78, 21)]
2 使用attrgetter
from operator import attrgetter
# 更高效的属性访问
sorted_by_grade = sorted(students, key=attrgetter('grade'))
sorted_multi = sorted(students, key=attrgetter('grade', 'age'))
实际案例:数据分析排序
1 销售数据排序
sales_data = [
{"product": "iPhone", "sales": 1200, "revenue": 1200000},
{"product": "iPad", "sales": 800, "revenue": 560000},
{"product": "MacBook", "sales": 500, "revenue": 750000},
{"product": "AirPods", "sales": 2000, "revenue": 260000}
]
# 按销售额排序
sorted_by_revenue = sorted(sales_data,
key=lambda x: x["revenue"],
reverse=True)
# 按销售量占比排序
total_sales = sum(item["sales"] for item in sales_data)
sorted_by_ratio = sorted(sales_data,
key=lambda x: x["sales"]/total_sales,
reverse=True)
print("按销售额排名:")
for item in sorted_by_revenue:
print(f"{item['product']}: ¥{item['revenue']:,}")
2 自定义排序规则
# 按照特定顺序排序
priority = {'high': 1, 'medium': 2, 'low': 3}
tasks = [
{"name": "Fix bug", "priority": "high"},
{"name": "Update docs", "priority": "low"},
{"name": "Add feature", "priority": "medium"},
{"name": "Review code", "priority": "high"}
]
sorted_tasks = sorted(tasks, key=lambda x: priority[x["priority"]])
print("按优先级排序:")
for task in sorted_tasks:
print(f" {task['priority']}: {task['name']}")
高级排序技巧
1 稳定排序
# Python的排序是稳定的
records = [
("Alice", "A"), ("Bob", "B"), ("Charlie", "A"),
("David", "B"), ("Eve", "A")
]
# 先按第二列排序,再按第一列排序
sorted_records = sorted(records, key=lambda x: x[0])
sorted_records = sorted(sorted_records, key=lambda x: x[1])
print(sorted_records) # 保持字母顺序
# [('Alice', 'A'), ('Charlie', 'A'), ('Eve', 'A'), ('Bob', 'B'), ('David', 'B')]
2 使用functools.cmp_to_key
from functools import cmp_to_key
# Python 2风格的比较函数
def compare_custom(a, b):
# 偶数优先,奇数靠后
if a % 2 == 0 and b % 2 == 1:
return -1
if a % 2 == 1 and b % 2 == 0:
return 1
# 同为偶数或奇数时按大小排序
return a - b
numbers = [3, 8, 1, 6, 4, 7, 2, 5]
sorted_numbers = sorted(numbers, key=cmp_to_key(compare_custom))
print(sorted_numbers) # [2, 4, 6, 8, 1, 3, 5, 7]
性能优化技巧
1 使用itemgetter
from operator import itemgetter data = [(1, 'A', 100), (2, 'B', 50), (3, 'C', 75)] # 比 lambda 更高效 sorted_by_third = sorted(data, key=itemgetter(2)) sorted_multi = sorted(data, key=itemgetter(1, 2))
2 预先计算排序键
# 对于复杂计算,预先计算键值
def complex_key(item):
# 假设这是一个计算密集的操作
return sum(item) * len(str(item))
data = [[1, 2, 3], [4, 5], [1, 2], [7, 8, 9]]
# 方法1:直接排序(重复计算)
sorted_data1 = sorted(data, key=complex_key)
# 方法2:预先计算(推荐)
keys = [complex_key(item) for item in data]
sorted_data2 = [x for _, x in sorted(zip(keys, data))]
实用建议
- 选择合适的方法:
list.sort()修改原列表,sorted()返回新列表 - 注意性能:对于大数据集,使用
key参数比自定义比较函数更高效 - 稳定性:Python排序是稳定的,可以利用这一点进行多级排序
- 避免复杂lambda:需要复杂排序逻辑时,定义命名函数或使用
functools.cmp_to_key
希望这些案例能帮助你更好地处理Python数据排序!需要更具体的应用场景吗?