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

如何移除嵌套对象列表中不匹配的子列表元素?

问题:过滤嵌套列表中不匹配的子元素

我有一个嵌套对象列表,每个外层对象包含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()

问题分析与修正代码

你当前的代码逻辑存在两处关键错误:

  1. i.pop()操作的是外层字典,会直接删除外层对象的键值对,而非处理test子列表的元素;
  2. 判断逻辑写反了——你需要保留匹配的元素,却在匹配时执行删除操作。

方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:45:29