Python字典列表更新异常:部分ID未添加、空ID列表缺失求排查
问题分析与代码修复
原始数据
list1= [{"id": "1e","name": "cup"},{"id": "4d","name": "cup"},{"id": "4c","name": "table"}] list2= [{"name": "cup"},{"name": "furniture"}]
需求
- 检查list2中每个字典的
name键是否与list1中各字典的name键匹配; - 匹配时将list1中对应的ID收集为列表,更新到list2的对应字典中;无匹配时,对应字典需添加空ID列表。
错误代码
for i in range(len(list2)): for j in range(len(list1)): list3 = [] if list2[i]['name'] == list1[j]['name']: list3.append(list1[j]['id']) list2[i].update(id= list3) print(list2)
当前输出
[{'name': 'cup', 'id': ['4d']}, {'name': 'furniture'}]
期望输出
[{'name': 'cup', 'id': ['4d','1e']}, {'name': 'furniture', 'id': []}]
错误原因
- 列表初始化位置错误:
list3 = []放在list1的循环内部,每次遍历list1的元素都会重置空列表,导致之前匹配到的1e被清空,最终只保留最后一次匹配的4d。 - 未处理无匹配场景:对于
furniture这类在list1中没有对应项的字典,没有主动添加id: []键值对,导致输出中缺少该字段。
修复后的代码
基础循环版本
for item2 in list2: # 先初始化空ID列表,确保每个字典都有id字段 id_list = [] for item1 in list1: if item2['name'] == item1['name']: id_list.append(item1['id']) item2['id'] = id_list print(list2)
列表推导式简化版本
for item2 in list2: item2['id'] = [item1['id'] for item1 in list1 if item1['name'] == item2['name']] print(list2)
运行上述修复代码后,就能得到符合预期的输出。
内容的提问来源于stack exchange,提问作者Srikanth S
相关产品推荐
相关产品推荐

