如何匹配字典id与列表数据并生成两种指定格式输出?
处理字典与列表的ID匹配需求
原始数据
mydict = { 'some-id-string1': {'name': 'Saeed1', 'phone': '+989307333730', 'id': 'abc'}, 'some-id-string2': {'name': 'Saeed2', 'phone': '+989307333731', 'id': 'def'}, 'some-id-string3': {'name': 'Saeed3', 'phone': '+989307333732', 'id': 'ghi'}, 'some-id-string4': {'name': 'Saeed3', 'phone': '+989307333733', 'id': 'jkl'}, 'some-id-string5': {'name': 'Saeed3', 'phone': '+989307333730', 'id': 'abc'}, 'some-id-string6': {'name': 'Saeed3', 'phone': '+989307333730', 'id': 'abc'}, 'some-id-string7': {'name': 'Saeed3', 'phone': '+989307333731', 'id': 'def'}, } mylist = [ {'id': 'abc', 'name': 'some_name1'}, {'id': 'def', 'name': 'some_name2'}, {'id': 'ghi', 'name': 'some_name3'}, ]
解决方案
先将mylist转换为以id为键的映射字典,实现O(1)时间复杂度的快速查找,解决重复ID和遍历效率问题:
# 构建id到name的映射字典 id_to_name = {item['id']: item['name'] for item in mylist}
1. 生成完整字典newmydict1(不匹配元素的id_name设为NOT_FOUND)
遍历mydict的每个元素,复制原数据并添加id_name字段:
newmydict1 = {} for outer_key, inner_data in mydict.items(): # 复制原内部字典,避免修改原始数据 updated_data = inner_data.copy() # 查找对应name,找不到则赋值为NOT_FOUND updated_data['id_name'] = id_to_name.get(inner_data['id'], 'NOT_FOUND') newmydict1[outer_key] = updated_data
2. 拆分匹配与不匹配元素为newmydict2和newmydict3
遍历过程中根据id是否存在于映射字典,将元素分别存入两个新字典:
newmydict2 = {} # 存储匹配id的元素(带id_name) newmydict3 = {} # 存储不匹配id的元素(带NOT_FOUND标记) for outer_key, inner_data in mydict.items(): if inner_data['id'] in id_to_name: # 匹配的元素,添加id_name后存入newmydict2 matched_data = inner_data.copy() matched_data['id_name'] = id_to_name[inner_data['id']] newmydict2[outer_key] = matched_data else: # 不匹配的元素,添加NOT_FOUND标记后存入newmydict3 unmatched_data = inner_data.copy() unmatched_data['id_name'] = 'NOT_FOUND' newmydict3[outer_key] = unmatched_data
说明
- 用字典映射替代列表遍历查找,解决了原列表推导式效率低、重复ID处理繁琐的问题。
- 处理时复制原内部字典,避免修改原始数据的结构和内容。
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

