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

Python优雅实现普通字典与嵌套字典的指定键值提取

问题描述

现有两个字典:

dict_1 = {"full_name": {"name": "Foo", "surname": "Bar"}, "age": 29, "test": 0}
dict_2 = {"name": "Foo", "age": 29, "test": 1}

需要编写一个filter_dict_for_key函数,不能用多个if/else分支,提取键"name"对应的值。实际场景中无法预知传入的是dict_1这类嵌套结构还是dict_2这类普通结构,但目标键"name"一定存在,预期两个字典的输出都是"Foo"。想知道有没有用filter、字典推导式等的Pythonic优雅实现方式?


解决方案

给你几个符合Python风格的优雅实现方案:

方案1:递归生成器遍历嵌套结构

用生成器惰性遍历字典的所有层级,找到目标键就返回对应值,逻辑简洁还能处理任意深度的嵌套:

def filter_dict_for_key(target_dict, key):
    for k, v in target_dict.items():
        if k == key:
            yield v
        elif isinstance(v, dict):
            yield from filter_dict_for_key(v, key)

# 测试示例
dict_1 = {"full_name": {"name": "Foo", "surname": "Bar"}, "age": 29, "test": 0}
dict_2 = {"name": "Foo", "age": 29, "test": 1}

print(next(filter_dict_for_key(dict_1, "name")))  # 输出: Foo
print(next(filter_dict_for_key(dict_2, "name")))  # 输出: Foo

方案2:扁平化嵌套键值对后查找

借助itertools.chain把所有嵌套的键值对扁平化成一个迭代器,再用生成器表达式匹配目标键:

from itertools import chain

def flatten_nested_dict(d):
    return chain.from_iterable(
        flatten_nested_dict(v) if isinstance(v, dict) else [(k, v)]
        for k, v in d.items()
    )

def filter_dict_for_key(target_dict, key):
    return next(v for k, v in flatten_nested_dict(target_dict) if k == key)

# 测试
print(filter_dict_for_key(dict_1, "name"))  # Foo
print(filter_dict_for_key(dict_2, "name"))  # Foo

方案3:递归收集所有匹配键(支持多同名键场景)

如果需要处理多个层级存在同名键的情况,用递归逻辑收集所有匹配的键值对,再返回目标值:

def collect_matching_keys(d, key):
    result = {}
    if key in d:
        result[key] = d[key]
    for v in d.values():
        if isinstance(v, dict):
            result.update(collect_matching_keys(v, key))
    return result

def filter_dict_for_key(target_dict, key):
    return collect_matching_keys(target_dict, key)[key]

# 测试
print(filter_dict_for_key(dict_1, "name"))  # Foo
print(filter_dict_for_key(dict_2, "name"))  # Foo

内容的提问来源于stack exchange,提问作者user44791

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:45:18