基于没有重复的键合并两个字典
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']
以上是关于基于没有重复的键合并两个字典的主要内容,如果未能解决你的问题,请参考以下文章