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
相关产品推荐
相关产品推荐

