如何用更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
相关产品推荐
相关产品推荐

