如何用Python从嵌套字典提取值?完善代码实现目标输出
Elasticsearch文档字段聚合解决方案
原始数据
[{'_index': 'script1', '_id': '123456', '_source': {'data_version': '20220701', 'SD_RESOURCE_TYPE': 'PDE', 'SD_RESOURCE_SIZE': 'UNIQUE'}}, {'_index': 'script11', '_id': '123457', '_source': {'data_version': '20220701', 'SD_RESOURCE_TYPE': 'CPS', 'SD_RESOURCE_SIZE': 'CLUSTER'}}, {'_index': 'script111', '_id': '123458', '_source': {'data_version': '20220701', 'SD_RESOURCE_TYPE': 'HIGH', 'SD_RESOURCE_SIZE': 'CLUSTER'}}]
需求目标
提取每个文档中_source字段的所有值,按字段名聚合到fields字典中,预期输出如下:
{'data_version': '20220701 20220701 20220701', 'SD_RESOURCE_TYPE': 'PDE CPS HIGH', 'SD_RESOURCE_SIZE': 'UNIQUE CLUSTER CLUSTER'}
(注:原预期输出中SD_RESOURCE_SIZE的第二个值存在笔误,已根据原始数据修正)
现有问题代码
fields = {} for num, doc in enumerate(elastic_docs): source_data = doc["_source"]
这段代码仅提取了每个_source数据,但未做字段聚合操作,无法得到预期结果。
解决方案
要实现按字段名聚合值,需要遍历每个_source的键值对,将对应字段的值收集起来,最终转换为符合预期的格式:
正确代码
fields = {} # 遍历所有文档,收集每个字段的值 for doc in elastic_docs: source_data = doc["_source"] for key, value in source_data.items(): # 若字段未在字典中,先初始化空列表 if key not in fields: fields[key] = [] # 将当前值追加到对应字段的列表中 fields[key].append(value) # 把列表转为空格分隔的字符串,匹配预期输出格式 for key in fields: fields[key] = ' '.join(fields[key])
代码说明
- 初始化空字典
fields用于存储聚合结果 - 遍历每个Elasticsearch文档,提取
_source中的键值对 - 对每个字段,先判断是否已存在于
fields中,不存在则初始化空列表,存在则追加当前值 - 最后将每个字段的列表转换为空格分隔的字符串,得到符合预期的格式
执行代码后即可得到目标结果。
内容的提问来源于stack exchange,提问作者ahmedaao
相关产品推荐
相关产品推荐

