Python如何在嵌套字典列表中匹配查找指定嵌套条件的对应元素
嵌套字典多条件查找函数实现
问题根因
你最初使用needle.items() <= item.items()的判断逻辑仅能对比字典顶层的键值对,当查询条件包含嵌套结构时,会将整个嵌套字典作为值进行全等对比,因此{'name':{'lastname': 'gram'}}的name对应的值是仅包含lastname的字典,和stack中对应元素name完整字典不相等,导致匹配失败。
实现思路
- 编写递归匹配辅助函数,支持任意深度的嵌套结构匹配,只要查询条件中指定的所有键路径对应的值和待匹配元素完全一致,即判定为匹配。
- 遍历stack中每个元素,只要匹配任意一个needle条件就加入结果集,同时避免同一元素匹配多个needle时重复进入结果。
完整代码实现
def find(needles, stack): def matches_condition(item, condition): # 递归判断单个元素是否匹配单个查询条件 for key, expected_val in condition.items(): if key not in item: return False current_val = item[key] # 预期值为字典时递归判断嵌套结构 if isinstance(expected_val, dict): if not isinstance(current_val, dict) or not matches_condition(current_val, expected_val): return False else: # 非字典类型直接对比值 if current_val != expected_val: return False return True result = [] for item in stack: # 匹配任意一个查询条件就保留 for needle in needles: if matches_condition(item, needle): result.append(item) # 匹配到条件后跳出循环,避免重复添加 break return result
调用测试
stack = [ {'id': '1', 'name': {'firstname': 'bob', 'lastname': 'smith'}}, {'id': '2', 'name': {'firstname': 'jane', 'lastname': 'abb'}}, {'id': '3', 'name': {'firstname': 'flo', 'lastname': 'gram', 'middle': 'remi'}}, {'id': '4', 'name': {'firstname': 'frank', 'lastname': 'glow'}, 'partner': 'diane'} ] needles = [{'name':{'lastname': 'gram'}}, {'partner': 'diane'} ] print(find(needles, stack))
输出结果符合预期:
[{'id': '3', 'name': {'firstname': 'flo', 'lastname': 'gram', 'middle': 'remi'}}, {'id': '4', 'name': {'firstname': 'frank', 'lastname': 'glow'}, 'partner': 'diane'}]
内容的提问来源于stack exchange,提问作者Flo
相关产品推荐
相关产品推荐

