如何从字典列表中仅保留指定键(_last_sync_time与display_name)?
如何从字典列表中仅保留指定键值对?
问题场景
现有一个JSON结构数据,其中results字段是包含多个字典的列表,每个字典包含多余字段,需要仅保留_last_sync_time和display_name两个键,此前尝试用map+selectattr组合处理未得到预期结果。
原始数据示例
{ "json": { "result_count": 4, "results": [ { "_last_sync_time": 1678118608741, "cm_local_id": "host-29", "display_name": "MyServerName1", "external_id": "xxxxxxxx-5c6f-41f7-b9a1-783e45xxxxxx:host-29", "hardware_id": "xxxxxxa4e601d71c4a51a56cf5xxxxxx", "ip_addresses": [ "10.x.x.1", "10.x.x.2" ], "node_type": "HostNode", "origin_id": "xxxxxxxx-5c6f-41f7-b9a1-783e45xxxxxx", "os_type": "ESXI", "os_version": "7.0.3", "resource_type": "DiscoveredNode", "stateless": false }, { "_last_sync_time": 1678118609865, "cm_local_id": "host-30", "display_name": "MyServerName2", "external_id": "xxxxxxxx-6d7a-52a8-c0b2-894f56xxxxxx:host-30", "hardware_id": "xxxxxxa5f712e82d5b62b67da6xxxxxx", "ip_addresses": [ "10.x.x.3", "10.x.x.4" ], "node_type": "HostNode", "origin_id": "xxxxxxxx-6d7a-52a8-c0b2-894f56xxxxxx", "os_type": "ESXI", "os_version": "7.0.3", "resource_type": "DiscoveredNode", "stateless": false } ] } }
解决方案
方法1:列表推导式(最直观高效)
直接遍历每个字典,提取目标键构造新字典:
# 假设原始数据存储在变量data中 filtered_results = [ { "_last_sync_time": item["_last_sync_time"], "display_name": item["display_name"] } for item in data["json"]["results"] ] # 更新原数据结构 data["json"]["results"] = filtered_results
方法2:使用map+lambda
如果偏好使用map,可配合lambda构造新字典(注意:selectattr不适用于字典键提取,它主要用于筛选对象属性):
filtered_results = list(map( lambda x: { "_last_sync_time": x["_last_sync_time"], "display_name": x["display_name"] }, data["json"]["results"] )) data["json"]["results"] = filtered_results
方法3:封装复用函数
如果需要多次处理不同的目标键,可封装成通用函数:
def filter_dict_keys(d, target_keys): return {k: d[k] for k in target_keys if k in d} # 指定要保留的键 target_keys = ["_last_sync_time", "display_name"] filtered_results = [filter_dict_keys(item, target_keys) for item in data["json"]["results"]] data["json"]["results"] = filtered_results
处理后预期输出
{ "json": { "result_count": 4, "results": [ { "_last_sync_time": 1678118608741, "display_name": "MyServerName1" }, { "_last_sync_time": 1678118609865, "display_name": "MyServerName2" } ] } }
误区说明
之前使用map+selectattr失败的原因:selectattr是用于筛选包含指定属性的对象(如类实例)的工具,不适用于字典的键提取操作,字典需直接通过键名访问值。
内容的提问来源于stack exchange,提问作者RAg
相关产品推荐
相关产品推荐

