Python数据排序案例如何排序数据集

wen python案例 32

本文目录导读:

Python数据排序案例如何排序数据集

  1. 基础排序方法
  2. 字典排序
  3. 复杂数据结构排序
  4. 实际案例:数据分析排序
  5. 高级排序技巧
  6. 性能优化技巧
  7. 实用建议

我来分享几个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))]

实用建议

  1. 选择合适的方法list.sort() 修改原列表,sorted() 返回新列表
  2. 注意性能:对于大数据集,使用 key 参数比自定义比较函数更高效
  3. 稳定性:Python排序是稳定的,可以利用这一点进行多级排序
  4. 避免复杂lambda:需要复杂排序逻辑时,定义命名函数或使用 functools.cmp_to_key

希望这些案例能帮助你更好地处理Python数据排序!需要更具体的应用场景吗?

抱歉,评论功能暂时关闭!