如何移除嵌套对象列表中不匹配的子列表元素?
问题:过滤嵌套列表中不匹配的子元素
我有一个嵌套对象列表,每个外层对象包含id字段和test子列表,需求是根据外层对象的id,保留test子列表中id__与外层id匹配的元素,移除不匹配项。
原始数据:
[ { "id": 1, "test": [ {"id__": 1}, {"id__": 1}, {"id__": 1}, {"id__": 2} ] }, { "id": 2, "test": [ {"id__": 1}, {"id__": 1}, {"id__": 1}, {"id__": 2} ] } ]
期望结果:
[ { "id": 1, "test": [ {"id__": 1}, {"id__": 1}, {"id__": 1} ] }, { "id": 2, "test": [ {"id__": 2} ] } ]
我尝试了以下代码(final为上述原始列表),但未得到满意结果:
for i in final: for j in i["test"]: if j['id__'] == i["id"]: i.pop()
问题分析与修正代码
你当前的代码逻辑存在两处关键错误:
i.pop()操作的是外层字典,会直接删除外层对象的键值对,而非处理test子列表的元素;- 判断逻辑写反了——你需要保留匹配的元素,却在匹配时执行删除操作。
方案1:用列表推导式重新赋值(简洁高效)
这是最直观的写法,直接筛选出符合条件的子元素替换原test列表:
for item in final: item["test"] = [sub for sub in item["test"] if sub["id__"] == item["id"]]
方案2:原地删除不匹配元素(适合需要保留原列表对象的场景)
如果不想创建新列表,可通过反向遍历删除不匹配项(避免正向遍历删除时索引错乱):
for item in final: target_id = item["id"] # 从后往前遍历索引 for idx in range(len(item["test"])-1, -1, -1): if item["test"][idx]["id__"] != target_id: del item["test"][idx]
运行上述任意一段代码后,final列表就会变成你期望的结果。
内容的提问来源于stack exchange,提问作者test new jiras
相关产品推荐
相关产品推荐

