如何简化基于多层级键的Python sorted函数lambda表达式实现?
问题:能否简化这段Python排序代码?
原代码可正常运行但写法繁琐:
a = 0 for k in keys: a = a + 1 if a == 1: k1 = k if a == 2: k2 = k if a == 3: k3 = k if a == 1: list_of_dict = sorted(list_of_dict, key = lambda ele: ele[k1], reverse = rev) if a == 2: list_of_dict = sorted(list_of_dict, key = lambda ele: ele[k1][k2], reverse = rev) if a == 3: list_of_dict = sorted(list_of_dict, key = lambda ele: ele[k1][k2][k3], reverse = rev)
提问者说明:reverse参数引用了未展示的变量rev,推测ele的处理有简化方法,询问是否存在更简洁的写法。
简化写法
可以通过动态嵌套取值的方式统一处理不同长度的keys,彻底消除重复分支:
方法1:自定义取值函数
def get_nested_value(element, keys): current = element for key in keys: current = current[key] return current list_of_dict = sorted(list_of_dict, key=lambda x: get_nested_value(x, keys), reverse=rev)
方法2:用reduce实现紧凑写法
from functools import reduce list_of_dict = sorted(list_of_dict, key=lambda ele: reduce(lambda val, k: val[k], keys, ele), reverse=rev)
思路说明
- 不管
keys包含1个、2个还是3个键,都通过循环(或reduce)逐层取出嵌套字典的值,避免了重复的条件判断 - 直接复用
keys列表本身,无需额外定义k1/k2/k3变量,也不用统计键的数量a - 逻辑更通用,后续
keys长度扩展到4个及以上时,代码无需修改
内容的提问来源于stack exchange,提问作者Oliver Williams
相关产品推荐
相关产品推荐

