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

Python中对象数组过滤数据为空,如何正确获取字段值?

问题:Python过滤JSON数据结果为空的排查与修复

需求是从JSON对象列表中筛选满足以下条件的对象:

  • type 等于 "answer"
  • rubric.id 属于指定值列表
  • segments 数组中存在指定id的元素

但执行现有过滤代码后,filtered_data始终为空,以下是原始JSON数据和代码:

原始JSON数据

[
    {
        "_id": "1",
        "type": "answer",
        "segments": [
            {
                "slug": "employees",
                "title": "employees",
                "id": "111111"
            },
            {
                "slug": "middle-employees",
                "title": "М",
                "id": "22222222"
            }
        ],
        "rubric": {
            "slug": "online",
            "title": "deal",
            "id": "123"
        }
    },
    {
        "_id": "2",
        "type": "instruction",
        "segments": [
            {
                "slug": "employees",
                "title": "employees",
                "id": "111111"
            },
            {
                "slug": "middle-employees",
                "title": "М",
                "id": "22222222"
            }
        ],
        "rubric": {
            "slug": "offline",
            "title": "off",
            "id": "345"
        }
    }
]

原始Python代码

def get_data_from_json(self, json_data):
    data = json.loads(json_data)
    filtered_data = [
        item for item in data
        if hasattr(item, "segments") and len(item["segments"]) != 0
           and any(seg_id in item["segments"]["id"] for seg_id in filter_config["segment_ids"])
           and item["rubric"]["id"] in filter_config["rubric_ids"]
           and item.get("type") == "answer"
    ]
    # 后续将使用filtered_data

错误原因分析

  1. hasattr误用:JSON加载后得到的是Python字典,不是类实例,hasattr(item, "segments")永远返回False,直接导致所有元素被过滤。应该用"segments" in item来检查键是否存在。
  2. segments遍历错误:item["segments"]是数组(列表),不能直接通过item["segments"]["id"]访问元素的id,需要遍历数组中的每个元素,取出id再判断是否在目标列表中。
  3. 冗余判断:len(item["segments"]) != 0可以省略,因为如果segments是空数组,any()会返回False,已经能满足非空的隐含要求。

修正后的代码

def get_data_from_json(self, json_data):
    data = json.loads(json_data)
    filtered_data = [
        item for item in data
        if "segments" in item
           and any(seg["id"] in filter_config["segment_ids"] for seg in item["segments"])
           and item["rubric"]["id"] in filter_config["rubric_ids"]
           and item.get("type") == "answer"
    ]
    # 后续使用filtered_data

关键修改点说明:

  • 用"segments" in item替代hasattr(item, "segments"),正确检查字典键存在
  • 将any(seg_id in item["segments"]["id"] ...)改为any(seg["id"] in ... for seg in item["segments"]),正确遍历segments数组中的每个元素并提取id
  • 移除冗余的len(item["segments"]) != 0判断,简化逻辑

假设filter_config中segment_ids包含"111111"或"22222222",且rubric_ids包含"123",修正后的代码会正确筛选出第一个对象。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:21:12