You need to enable JavaScript to run this app. Python 嵌套字典列表键值匹配移除子项及AttributeError报错解决
优惠活动
大模型
产品
解决方案
定价
更多

Python 嵌套字典列表键值匹配移除子项及AttributeError报错解决

报错原因与正确实现方案

报错的核心根源

你写的列表推导式存在两个关键逻辑错位:

  • 遍历层级不对:本来要以d1列表里的每一个完整顶层字典(也就是每个节点、每条边的全量结构)为单位判断是否保留,结果推导式把每个顶层字典拆成了单个键值对逐对判断,最后生成的结果结构也会完全偏离,根本不是原来的嵌套字典列表格式。
  • 类型判断缺失:拆出的键值对里,classes键对应的值是字符串(比如'genesis'、'followerNode'),你直接对这个字符串调用字典才有的get()方法,字符串本身没有这个属性,自然会抛出AttributeError。

正确的过滤思路

这类cytoscape格式的图数据结构是固定的:所有需要匹配的id、source、target字段,都存在每个顶层字典的data子键下面,classes键仅存储节点/边的样式类,不需要参与匹配判断。
过滤的规则很清晰:对每个顶层字典,先把内层的data字典取出来,检查里面的id、source、target三个字段,只要任意一个字段值等于要搜索的目标值,就把这个顶层字典整个移除,剩下的结构原样保留即可。

正确实现的代码:

# 定义要匹配的搜索值
target = "1"
# 执行过滤
filtered_d1 = [
    item for item in d1
    # 任意字段匹配目标值,就排除该条目
    if not (
        item["data"].get("id") == target
        or item["data"].get("source") == target
        or item["data"].get("target") == target
    )
]

匹配逻辑的注意事项

  • 上述代码采用严格相等判断,适合图结构的精确关联场景,不会误把id为"13"、"21"这类包含字符"1"但值不完全等于"1"的条目过滤掉。如果需要做模糊子串匹配,只要把判断条件替换为target in str(item["data"].get(对应字段, ""))即可。
  • 用搜索值"1"测试时,过滤结果会精准移除两类条目:id为"1"的创世节点、所有target指向"1"的关联边,完全匹配示例里的移除要求。

内容的提问来源于stack exchange,提问作者June

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 13:15:06