如何在Python嵌套字典列表中匹配子字符串?
解决嵌套列表嵌套字典的包含匹配提取问题
你的需求是从嵌套列表中提取所有包含指定字符串(包含匹配)的外层列表,原代码存在逻辑反转、未处理嵌套字典、结果收集方式错误三个问题,以下是修正方案:
问题分析
- 逻辑反转:原代码
myDict.get(key) in value是判断字典中A的值是否是目标字符串的子串,而实际需要的是目标字符串是否在A的值中(包含匹配)。 - 未处理嵌套字典:原代码仅检查直接拥有
A键的字典,无法识别{'BB': {'A': 'xxx'}}这种嵌套结构中的A值。 - 结果收集错误:原代码是将符合条件的单个字典加入列表,而需求是保留整个外层嵌套列表(只要该列表内存在任意一个符合条件的字典)。
解决方案
通用递归方案(支持任意层级嵌套)
先定义一个递归函数,用于检查单个字典(包括嵌套字典)是否存在A键的值包含目标字符串,再过滤外层列表:
def has_matching_value(d, target): for k, v in d.items(): # 检查当前键是否为A,且值是包含目标的字符串 if k == 'A' and isinstance(v, str) and target in v: return True # 如果值是字典,递归检查嵌套结构 elif isinstance(v, dict): if has_matching_value(v, target): return True return False data = [[{'A': 'test1'}, {'A': 'test2'}, {'BB': {'A': '111testabc'}}], [{'A': 'test1'}, {'A': 'test3'}, {'BB': {'A': '999000abc'}}], [{'A': 'test1'}, {'A': 'test4'}, {'BB': {'A': '99111testabc123'}}], [{'A': 'test1'}, {'A': 'test5'}, {'BB': {'A': '123456abc'}}]] target = '111testabc' # 过滤外层列表:只要列表内有任意一个字典符合条件,就保留整个列表 result = [outer_list for outer_list in data if any(has_matching_value(d, target) for d in outer_list)] print(result)
固定层级方案(仅针对你的示例嵌套结构)
如果确定嵌套只有一层(如仅BB下嵌套A),可以用更简洁的非递归写法:
data = [[{'A': 'test1'}, {'A': 'test2'}, {'BB': {'A': '111testabc'}}], [{'A': 'test1'}, {'A': 'test3'}, {'BB': {'A': '999000abc'}}], [{'A': 'test1'}, {'A': 'test4'}, {'BB': {'A': '99111testabc123'}}], [{'A': 'test1'}, {'A': 'test5'}, {'BB': {'A': '123456abc'}}]] target = '111testabc' result = [] for outer_list in data: match_found = False for d in outer_list: # 检查直接的A键 if 'A' in d and target in d['A']: match_found = True break # 检查嵌套字典中的A键 for val in d.values(): if isinstance(val, dict) and 'A' in val and target in val['A']: match_found = True break if match_found: result.append(outer_list) print(result)
两种方案运行后都会输出你期望的结果:
[[{'A': 'test1'}, {'A': 'test2'}, {'BB': {'A': '111testabc'}}], [{'A': 'test1'}, {'A': 'test4'}, {'BB': {'A': '99111testabc123'}}]]
内容的提问来源于stack exchange,提问作者Preeti
相关产品推荐
相关产品推荐

