前言
补充原先的基本知识: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)
截图如下: