基于无重复项的键合并两个词典

2024-06-26 08:29:41 发布

您现在位置:Python中文网/ 问答频道 /正文

第1条:

{'result2': [{'2': '22'}, {'22': '222'}], 'result1': [{'1': '11'}, {'11': '111'}]}

第2条:

{'result2': [{'two': 'twentytwo'}, {'22': '222'}], 'result1': [{'one': 'eleven'}, {'11': '111'}]}

我想根据键result1和result 2合并它们,并保留相同的格式

预期产量

{"result1":[{"1":"11"},{"one":"eleven"},{"11":"111"}]},{"result2":[{"2":"22"},{"two":"twentytwo"},{"22":"222"}]}

两个dict的键不一定具有相同的索引


Tags: 格式resultonedict产量tworesult1result2
2条回答

您可以将其分为两个阶段:

  1. 通过添加列表来合并词典
  2. 从生成的合并词典中删除重复项

dict1={'result2': [{'2': '22'}, {'22': '222'}], 
       'result1': [{'1': '11'}, {'11': '111'}]}
dict2={'result2': [{'two': 'twentytwo'}, {'22': '222'}], 
       'result1': [{'one': 'eleven'}, {'11': '111'}]}

# merge phase
dict3 = {k:dict1.get(k,[])+dict2.get(k,[]) for k in {*dict1,*dict2}}
        
# uniqueness phase
dict3 = {k:[d for i,d in enumerate(v) if v.index(d)==i] 
         for k,v in dict3.items()}
    
print(dict3)

{'result2': [{'2': '22'}, {'22': '222'}, {'two': 'twentytwo'}],
 'result1': [{'1': '11'}, {'11': '111'}, {'one': 'eleven'}]}

请注意,您可以将两个阶段合并到一个大型词典理解中:

dict3 = {k: [d for i,d in enumerate(v) if v.index(d)==i]
         for k in {*dict1,*dict2}
         for v in [dict1.get(k,[])+dict2.get(k,[])] }

如果保证dict1和dict2具有相同的密钥,则整个过程可以更简洁地执行:

dict3 = {k:v+[w for w in dict2[k] if w not in v] for k,v in dict1.items()}

为输出添加所需的格式总是好的。它就像您想要列出包含来自result1&;的数据的dict;结果2

鉴于—

a = [{"result1":[{"1":"11"},{"11":"111"}]},{"result2":[{"2":"22"},{"22":"222"}]}]
b = [{"result1":[{"one":"eleven"},{"11":"111"}]},{"result2":[{"two":"twentytwo"},{"22":"222"}]}]

这是代码-

desired_op = []
for index, item in enumerate(a):
   inner_item = {}
   for key, value in item.items():
     #print (key, value + b[index][key])
     inner_item[key] = value + b[index][key]
   desired_op.append(inner_item)
 
print (desired_op)
[{'result1': [{'1': '11'}, {'11': '111'}, {'one': 'eleven'}, {'11': '111'}]}, {'result2': [{'2': '22'}, {'22': '222'}, {'two': 'twentytwo'}, {'22': '222'}]}]

如果您需要独特的项目,它将有点复杂-

desired_op = []
 for index, item in enumerate(a):
   inner_item = {}
   for key, value in item.items():
     #print (key, value + b[index][key])
     inner_item[key] = list({list(litem.keys())[0]:litem for litem in value + b[index][key]}.values())
   desired_op.append(inner_item)
 
print (desired_op)
[{'result1': [{'1': '11'}, {'11': '111'}, {'one': 'eleven'}]}, {'result2': [{'2': '22'}, {'22': '222'}, {'two': 'twentytwo'}]}]

对评论的后续行动

简单的附加可以工作,但为此,您必须确保第二个列表中的第一个索引应该包含result1&;第二个索引应包含作为dict键的result2

例如(但这不会删除重复项)

a[0]['result1'].extend(b[0]['result1'])
a[1]['result2'].extend(b[1]['result2'])
print(a)
[{'result1': [{'1': '11'}, {'11': '111'}, {'one': 'eleven'}, {'11': '111'}]}, {'result2': [{'2': '22'}, {'22': '222'}, {'two': 'twentytwo'}, {'22': '222'}]}]

如果您不确定索引在第二个列表中的位置,这将起作用-

keys_mapping =  {list(item.keys())[0]:index for index, item in enumerate(a)}
print (keys_mapping)
{'result1': 0, 'result2': 1}

for item in b:
  key = list(item.keys())[0]
  a[keys_mapping[key]][key].extend(item[key])
print (a)
[{'result1': [{'1': '11'}, {'11': '111'}, [{'one': 'eleven'}, {'11': '111'}]]}, {'result2': [{'2': '22'}, {'22': '222'}, [{'two': 'twentytwo'}, {'22': '222'}]]}]

相关问题 更多 >