本文目录导读:

我来分享几个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数据排序!需要更具体的应用场景吗?
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播