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

如何在Python嵌套字典列表中匹配子字符串?

解决嵌套列表嵌套字典的包含匹配提取问题

你的需求是从嵌套列表中提取所有包含指定字符串(包含匹配)的外层列表,原代码存在逻辑反转、未处理嵌套字典、结果收集方式错误三个问题,以下是修正方案:

问题分析

  1. 逻辑反转:原代码myDict.get(key) in value是判断字典中A的值是否是目标字符串的子串,而实际需要的是目标字符串是否在A的值中(包含匹配)。
  2. 未处理嵌套字典:原代码仅检查直接拥有A键的字典,无法识别{'BB': {'A': 'xxx'}}这种嵌套结构中的A值。
  3. 结果收集错误:原代码是将符合条件的单个字典加入列表,而需求是保留整个外层嵌套列表(只要该列表内存在任意一个符合条件的字典)。

解决方案

通用递归方案(支持任意层级嵌套)

先定义一个递归函数,用于检查单个字典(包括嵌套字典)是否存在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:20:18