Bootstrap

详细分析 python3 多重排序处理多数据 (附Demo)

前言

补充原先的基本知识:python关于sorted排序函数详细解析 附实战代码(全)

主要讲解多种方式的处理,以实际的Demo为主

方法优点缺点
内置 sorted() 函数与 lambda 表达式简单易用,代码简洁
适合处理较小的数据集
对于大型数据集,性能可能不如专用的库高效
operator 模块提高可读性,尤其是在复杂键提取的情况下仍然是基于 sorted() 的实现,对于大型数据集,性能有限
pandas 库高效处理大型数据集
提供丰富的数据操作功能
需要学习和掌握 pandas 库的使用
numpy 库高效处理数值数据
适用于大型数值数据集
对于非数值数据(如字符串),可能不如 pandas 方便

1. 内置 sorted() 函数与 lambda 表达式

提供一个键函数来实现多重排序

键函数可以是一个 lambda 表达式,用来返回一个元组,元组中的每个元素按照优先级进行排序

data = [
    {'name': 'Alice', 'age': 30, 'score': 88},
    {'name': 'Bob', 'age': 25, 'score': 92},
    {'name': 'Charlie', 'age': 30, 'score': 95},
    {'name': 'David', 'age': 25, 'score': 85}
]

# 按 age 和 score 排序,age 升序,score 降序
sorted_data = sorted(data, key=lambda x: (x['age'], -x['score']))

print(sorted_data)

截图大致如下:

在这里插入图片描述

sorted() 函数不仅可以处理数字数据,还可以处理字符串和其他非数字数据

通过 lambda 表达式,可以指定任意的排序逻辑

data = [
    {'name': 'Alice', 'department': 'HR', 'role': 'Manager'},
    {'name': 'Bob', 'department': 'Engineering', 'role': 'Developer'},
    {'name': 'Charlie', 'department': 'HR', 'role': 'Assistant'},
    {'name': 'David', 'department': 'Engineering', 'role': 'Manager'}
]

# 按 department 和 role 排序
sorted_data = sorted(data, key=lambda x: (x['department'], x['role']))

print(sorted_data)

数据先按 department 字段排序,再按 role 字段排序

2. operator 模块

from operator import itemgetter

data = [
    {'name': 'Alice', 'age': 30, 'score': 88},
    {'name': 'Bob', 'age': 25, 'score': 92},
    {'name': 'Charlie', 'age': 30, 'score': 95},
    {'name': 'David', 'age': 25, 'score': 85}
]

# 按 age 和 score 排序,age 升序,score 降序
sorted_data = sorted(data, key=itemgetter('age', 'score'), reverse=True)
# 注意:要实现 age 升序,score 降序,我们需要稍作调整
sorted_data = sorted(sorted_data, key=itemgetter('age'))

print(sorted_data)

operator 模块中的 itemgetter 函数也适用于非数字数据的排序

from operator import itemgetter

data = [
    {'name': 'Alice', 'department': 'HR', 'role': 'Manager'},
    {'name': 'Bob', 'department': 'Engineering', 'role': 'Developer'},
    {'name': 'Charlie', 'department': 'HR', 'role': 'Assistant'},
    {'name': 'David', 'department': 'Engineering', 'role': 'Manager'}
]

# 按 department 和 role 排序
sorted_data = sorted(data, key=itemgetter('department', 'role'))

print(sorted_data)

3. pandas 库

大型数据集,使用 pandas 库可以更高效地进行多重排序

import pandas as pd

data = [
    {'name': 'Alice', 'age': 30, 'score': 88},
    {'name': 'Bob', 'age': 25, 'score': 92},
    {'name': 'Charlie', 'age': 30, 'score': 95},
    {'name': 'David', 'age': 25, 'score': 85}
]

df = pd.DataFrame(data)

# 按 age 升序和 score 降序排序
sorted_df = df.sort_values(by=['age', 'score'], ascending=[True, False])

print(sorted_df)

同样可处理非数字

import pandas as pd

data = [
    {'name': 'Alice', 'department': 'HR', 'role': 'Manager'},
    {'name': 'Bob', 'department': 'Engineering', 'role': 'Developer'},
    {'name': 'Charlie', 'department': 'HR', 'role': 'Assistant'},
    {'name': 'David', 'department': 'Engineering', 'role': 'Manager'}
]

df = pd.DataFrame(data)

# 按 department 和 role 排序
sorted_df = df.sort_values(by=['department', 'role'])

print(sorted_df)

4. numpy 库

适用于数值数据

import numpy as np

data = np.array([
    ('Alice', 30, 88),
    ('Bob', 25, 92),
    ('Charlie', 30, 95),
    ('David', 25, 85)
], dtype=[('name', 'U10'), ('age', 'i4'), ('score', 'i4')])

# 按 age 升序和 score 降序排序
sorted_data = np.sort(data, order=['age', 'score'])[::-1]
sorted_data = np.sort(sorted_data, order=['age'])

print(sorted_data)

5. 自定义

某些情况下,可能需要更复杂的排序逻辑,可以定义自定义排序函数并将其传递给 sorted() 函数

data = [
    {'name': 'Alice', 'department': 'HR', 'role': 'Manager'},
    {'name': 'Bob', 'department': 'Engineering', 'role': 'Developer'},
    {'name': 'Charlie', 'department': 'HR', 'role': 'Assistant'},
    {'name': 'David', 'department': 'Engineering', 'role': 'Manager'}
]

# 自定义排序函数
def custom_sort(item):
    return (item['department'], item['role'])

# 按 department 和 role 排序
sorted_data = sorted(data, key=custom_sort)

print(sorted_data)

截图如下:

在这里插入图片描述

;