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
相关产品推荐
相关产品推荐

