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

如何从字典列表中仅保留指定键(_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:47:52