如何不使用Lambda与ItemGetter实现Python嵌套字典排序
嵌套字典按指定字段排序实现方案
约束前提
实现需要满足:不使用Lambda表达式、不调用operator模块的itemgetter方法,最终排序逻辑、运行结果和原有实现完全一致。
可选实现方案
sorted()函数的key参数仅要求传入可调用对象,能够从每一个遍历元素中提取出用于排序比较的值即可,不需要依赖lambda或者operator模块的工具函数,常见实现有以下几种:
- 固定字段自定义提取函数:适合排序字段固定的场景,代码最简洁
main_dict = {} main_dict['Kevin'] = {'ID': '1', 'Last Name': 'Jones', 'First Name': 'Kevin'} main_dict['David'] = {'ID': '2', 'Last Name': 'Walker', 'First Name': 'David'} # 自定义普通函数提取排序依据字段 def get_lastname_key(item): # 遍历items()得到的元素是(外层字典键, 内层嵌套字典)的元组,直接通过键取值即可 return item[1]['Last Name'] sorted_lastname = sorted(main_dict.items(), key=get_lastname_key) print(sorted_lastname)
运行输出和原有代码完全一致:
[('Kevin', {'ID': '1', 'Last Name': 'Jones', 'First Name': 'Kevin'}), ('David', {'ID': '2', 'Last Name': 'Walker', 'First Name': 'David'})]
- 闭包工厂实现动态字段提取:适合需要灵活切换排序字段的场景,不用为每个排序字段写重复的提取函数
def make_key_extractor(sort_field): def extractor(item): return item[1][sort_field] return extractor # 按Last Name排序 sorted_lastname = sorted(main_dict.items(), key=make_key_extractor('Last Name')) # 如果要换按ID排序,直接改传参即可:key=make_key_extractor('ID')
- 可调用类实现提取器:适合排序逻辑复杂、需要额外扩展能力的场景
class NestedDictKeyExtractor: def __init__(self, sort_field): self.sort_field = sort_field def __call__(self, item): return item[1][self.sort_field] sorted_lastname = sorted(main_dict.items(), key=NestedDictKeyExtractor('Last Name'))
以上所有实现都完全满足约束条件,没有使用Lambda表达式,也没有导入、调用operator模块的任何方法。当排序逻辑比较复杂(比如需要多字段组合排序、排序前先对字段值做预处理)时,自定义提取函数/类的可读性和可维护性比lambda表达式更好。
内容的提问来源于stack exchange,提问作者Hamza Saeed
相关产品推荐
相关产品推荐

