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

如何用更Pythonic的推导式筛选字典列表中符合条件的dataElement

按条件筛选dataElement id需求实现

给定数据结构

data = {
    "data": [
        {
            "categoryOptionCombo": {
                "id": "A"
            },
            "dataElement": {
                "id": "123"
            }
        },
        {
            "categoryOptionCombo": {
                "id": "B"
            },
            "dataElement": {
                "id": "123"
            }
        },
        {
            "categoryOptionCombo": {
                "id": "C"
            },
            "dataElement": {
                "id": "456"
            }
        }
    ]
}

需求说明

筛选出关联的不同categoryOptionCombo数量大于1的dataElement的id,示例数据预期输出为['123']:id为123的dataElement关联了2个不同的categoryOptionCombo,符合筛选条件。

现有实现代码

tracker = {}
for d in data['data']:
    data_element = d['dataElement']['id']
    coc = d['categoryOptionCombo']['id']
    if data_element not in tracker:
        tracker[data_element] = set()
    tracker[data_element].add(coc)

too_many = [key for key,value in tracker.items() if len(value) > 1]

更Pythonic的实现方案

方案1:纯推导式实现(符合优先使用推导式的要求)

# 先通过双层推导式完成分组去重统计
tracker = {
    de_id: {d["categoryOptionCombo"]["id"] for d in data["data"] if d["dataElement"]["id"] == de_id}
    for de_id in {d["dataElement"]["id"] for d in data["data"]}
}
# 过滤出符合条件的dataElement id
too_many = [k for k, v in tracker.items() if len(v) > 1]

注意:该写法完全使用推导式实现,适合小数据集场景,大数据集下会有重复遍历的性能损耗。

方案2:defaultdict简化版(综合可读性、性能最优)

如果可以接受少量非推导式代码,该方案是工业界常用写法:

from collections import defaultdict

tracker = defaultdict(set)
for d in data["data"]:
    tracker[d["dataElement"]["id"]].add(d["categoryOptionCombo"]["id"])

too_many = [k for k, v in tracker.items() if len(v) > 1]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:54:06