如何在Python中按动态多参数对字典列表进行排序
动态多键排序字典列表的实现
实现思路
你可以通过动态生成排序用的key函数解决这个问题:利用生成器表达式将多个排序键对应的值打包成元组,元组的比较会按元素顺序依次进行,完美匹配多键排序的需求,避免了逐个排序导致的结果覆盖问题。
完整函数实现
def processList(l, sortId=None): # 复制原列表,避免修改输入的原始列表 sorted_list = l.copy() if sortId is not None: # 兼容单个键字符串的输入,转为列表统一处理 if isinstance(sortId, str): sort_keys = [sortId] elif isinstance(sortId, (list, tuple)): sort_keys = sortId else: # 无效的sortId类型,直接返回原列表 return sorted_list # 动态生成key函数:返回包含所有排序键对应值的元组 sorted_list.sort(key=lambda x: tuple(x[key] for key in sort_keys)) return sorted_list
测试示例
首先定义测试用的字典列表:
test_list = [ {'name': 'alpha', 'price': 200, 'date': '2022-02-01'}, {'name': 'beta', 'price': 400, 'date': '2022-03-01'}, {'name': 'delta', 'price': 500, 'date': '2022-05-01'}, {'name': 'zeta', 'price': 400, 'date': '2022-02-10'}, {'name': 'kappa', 'price': 500, 'date': '2022-01-31'} ]
1. 按单个键name排序
result = processList(test_list, sortId='name') print(result)
输出:
[ {'name': 'alpha', 'price': 200, 'date': '2022-02-01'}, {'name': 'beta', 'price': 400, 'date': '2022-03-01'}, {'name': 'delta', 'price': 500, 'date': '2022-05-01'}, {'name': 'kappa', 'price': 500, 'date': '2022-01-31'}, {'name': 'zeta', 'price': 400, 'date': '2022-02-10'} ]
2. 按price+date组合排序
result = processList(test_list, sortId=['price', 'date']) print(result)
输出:
[ {'name': 'alpha', 'price': 200, 'date': '2022-02-01'}, {'name': 'zeta', 'price': 400, 'date': '2022-02-10'}, {'name': 'beta', 'price': 400, 'date': '2022-03-01'}, {'name': 'kappa', 'price': 500, 'date': '2022-01-31'}, {'name': 'delta', 'price': 500, 'date': '2022-05-01'} ]
补充说明
- 使用
l.copy()是为了保持函数的纯性,避免修改外部传入的原始列表;如果业务允许原地修改,可以直接对l调用sort()方法。 - 函数兼容单个键字符串和多键列表/元组的输入,同时对无效的
sortId类型做了容错处理。
内容的提问来源于stack exchange,提问作者Varun Pius Rodrigues
相关产品推荐
相关产品推荐

