如何修改递归函数捕获extras的兄弟键cat及父键id并合并结果?
递归获取字典中目标键值并合并兄弟/父键的解决方案
我理解你的需求:原来的findkeys函数可以递归提取所有extras键的值,但现在需要把每个extras对应的兄弟键cat和上层父键id也合并到结果里,而且product类的键名不固定(比如product/products/produkt),必须先定位extras再关联对应的兄弟和父键。
修改后的递归函数
def findkeys(node, kv, parent=None): if isinstance(node, list): for i in node: yield from findkeys(i, kv, parent=node) elif isinstance(node, dict): if kv in node: # 复制extras的内容作为基础结果 result = node[kv].copy() # 添加兄弟键cat(如果存在) if 'cat' in node: result['cat'] = node['cat'] # 添加父节点的id(如果父节点存在且包含id) if parent is not None and 'id' in parent: result['id'] = parent['id'] yield result # 遍历字典值,传递当前字典作为子节点的父节点 for j in node.values(): yield from findkeys(j, kv, parent=node)
核心思路说明
- 新增父节点参数:通过
parent参数在递归过程中传递当前节点的父节点信息,这样当找到extras时,能直接获取到上层的id值。 - 合并键值对:
- 找到
extras后,先复制它的内容到结果字典(避免修改原数据)。 - 从
extras所在的字典中提取兄弟键cat(因为extras和cat是同一层级的键)。 - 从
parent(也就是包含product类键的上层字典)中提取id值。
- 找到
- 兼容不固定键名:不需要关心
product类的具体键名,只要定位到包含extras的字典,就能关联到对应的兄弟和父键,完美适配你给出的测试数据。
测试验证
用你提供的测试字典:
test_dict = { "contents":[ { "product":{ "extras":{ "size":"large", "color":"green", "name":"shirt" }, "cat":"male" }, "id":"a12b" }, { "products":{ "extras":{ "size":"small", "color":"red", "name":"trouser" }, "cat":"male", "price":12.21 }, "id":"a23b" }, { "produkt":{ "extras":{ "size":"medium", "color":"yellow", "name":"hat" }, "cat":"female", "price":2.87, "units":100 }, "id":"a34b" } ] } # 调用函数并输出结果 print(list(findkeys(test_dict, 'extras')))
输出结果完全符合你的期望:
[ {'size': 'large', 'color': 'green', 'name': 'shirt', 'cat': 'male', 'id': 'a12b'}, {'size': 'small', 'color': 'red', 'name': 'trouser', 'cat': 'male', 'id': 'a23b'}, {'size': 'medium', 'color': 'yellow', 'name': 'hat', 'cat': 'female', 'id': 'a34b'} ]
内容的提问来源于stack exchange,提问作者agustin
相关产品推荐
相关产品推荐

