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

为API返回的字典列表添加displayName键时出现重复值问题求助

问题:为实例列表批量添加匹配的displayName字段

我需要给从API获取的字典列表中每个实例添加displayName键,值来自另一个API的响应。匹配规则是源API返回的instance_id与另一组字典中ec2VirtualMachineSummary下的instanceID对应,提取对应项的displayName。但目前写入文件时,所有实例的displayName值完全相同。

当前代码

up = {}
li = []
for instance in instances:
    for key, value in instance.items():
        up.setdefault(key, value)
        if key == 'instance_id':
            for node in temp:
                if value == (node.get('ec2VirtualMachineSummary', {}).get('instanceID', {})):
                    up.setdefault('displayName', node.get('displayName'))
    li.append(up)

源数据结构

{
    "instance_id": "ABC XYZ",
    "instance_type": "ABC XYZ",
    "Resource is Exposed to Public": "ABC XYZ"
}

期望结果结构

{
    "instance_id": "ABC XYZ",
    "instance_type": "ABC XYZ",
    "Resource is Exposed to Public": "ABC XYZ",
    "displayName": "This value is that I am adding"
}

问题原因

  1. 字典引用重复:up = {}定义在循环外部,所有循环都修改同一个字典对象,最终列表li里的所有元素都是指向这个字典的引用,导致所有实例的内容完全一致。
  2. setdefault逻辑问题:setdefault仅在键不存在时赋值,后续即使匹配到新的displayName也不会更新,只会保留第一次设置的值。

修正后的代码

li = []
# 预先生成instanceID到displayName的映射字典,提升匹配效率
instance_display_map = {}
for node in temp:
    vm_summary = node.get('ec2VirtualMachineSummary', {})
    instance_id = vm_summary.get('instanceID')
    if instance_id:
        instance_display_map[instance_id] = node.get('displayName')

for instance in instances:
    # 复制原实例的所有数据,创建新字典
    up = instance.copy()
    # 根据instance_id匹配对应的displayName,无匹配时设为None(可按需调整)
    up['displayName'] = instance_display_map.get(instance.get('instance_id'))
    li.append(up)

优化说明

  1. 预生成映射字典:提前遍历temp生成以instanceID为键的映射,避免每次处理实例都遍历整个temp列表,数据量大时性能提升明显。
  2. 创建独立字典:每次循环通过instance.copy()创建新字典,确保每个实例的修改互不影响。
  3. 直接赋值替代setdefault:直接给displayName赋值,确保匹配到对应值时能正确设置,无匹配时也能明确处理(比如设为None)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 19:14:53