为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" }
问题原因
- 字典引用重复:
up = {}定义在循环外部,所有循环都修改同一个字典对象,最终列表li里的所有元素都是指向这个字典的引用,导致所有实例的内容完全一致。 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)
优化说明
- 预生成映射字典:提前遍历
temp生成以instanceID为键的映射,避免每次处理实例都遍历整个temp列表,数据量大时性能提升明显。 - 创建独立字典:每次循环通过
instance.copy()创建新字典,确保每个实例的修改互不影响。 - 直接赋值替代
setdefault:直接给displayName赋值,确保匹配到对应值时能正确设置,无匹配时也能明确处理(比如设为None)。
内容的提问来源于stack exchange,提问作者Aditya Arora
相关产品推荐
相关产品推荐

