You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:24:37