基于没有重复的键合并两个字典

Posted

技术标签:

【中文标题】基于没有重复的键合并两个字典【英文标题】:Merge a two dictionaries based on keys with no duplicates 【发布时间】:2021-12-04 08:46:48 【问题描述】:

字典 1:

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

字典 2:

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

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

预期输出

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

而且两个dict的键不一定有相同的索引。

【问题讨论】:

输出会是什么? 首先,呈现所需的输出。其次,合并是什么意思?你想把字符串变成整数吗? 更新了输出@eh329 【参考方案1】:

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

    通过附加列表合并字典 从生成的合并字典中删除重复项

...

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有相同的key,那么整个过程可以更简洁地执行:

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

【讨论】:

【参考方案2】:

为输出添加所需的格式总是好的。它喜欢你想要列出包含来自结果 1 和结果 2 的数据的 dict 列表。

给定-

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 并且第二个索引应该包含 result2 作为 dict 键。

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

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']]]

【讨论】:

有没有机会使用字典的 update() 函数来简化它? 而且两个dict的索引不一定有相同的key。 如果您确定格式、索引和键。简单的附加可以工作。更新答案 简化了问题。如果你看看它会很棒 @regretter 在这种情况下 a['result2'].extend(b['result2']) a['result1'].extend(b['result1']) 将起作用,但重复将保持不变 'result2': ['2': '22', '22': '222', 'two': 'twentytwo', '22': '222'], 'result1': ['1': '11', '11': '111', 'one': 'eleven', '11': '111']

以上是关于基于没有重复的键合并两个字典的主要内容,如果未能解决你的问题,请参考以下文章

以pythonic方式打印字典中最大值的键[重复]

在字典中查找重复值并打印重复元素的键

python 中关于字典的键

在字典中查找重复列表并打印重复列表的键

用两个列表中的键、值初始化 dict [重复]

将两个数组(键和值)合并为一个对象[重复]