使用两个值组成的键合并Python中的两个字典

时间:2019-01-08 14:56:34

标签: python dictionary

我有类似-

的数据
sample 1, domain 1, value 1
sample 1, domain 2, value 1
sample 2, domain 1, value 1
sample 2, domain 3, value 1

-存储在字典中-

dict_1 = {('sample 1','domain 1'): value 1, ('sample 1', 'domain 2'): value 1} 

-等等

现在,我有另一种值,名为值2-

sample 1, domain 1, value 2
sample 1, domain 2, value 2
sample 2, domain 1, value 2
sample 2, domain 3, value 2

-我再次放入字典中,

dict_2 = {('sample 1','domain 1'): value 2, ('sample 1', 'domain 2'): value 2}

如何在python中合并这两个字典?两个字典的键,例如('sample 1', 'domain 1')是相同的。

我希望它看起来像-

final_dict = {('sample 1', 'domain 1'): (value 1, value 2), ('sample 1', 'domain 2'): (value 1, value 2)}

-等等

4 个答案:

答案 0 :(得分:2)

您可能最接近的是dict个(或list个)中的一个set。为简单起见,通常使用go with collections.defaultdict(list),这样就不会经常检查密钥是否已存在。您需要将某些类型的集合映射为一个值,因为dict具有唯一的键,因此您需要某种方式来对要为每个键存储的多个值进行分组。

from collections import defaultdict

final_dict = defaultdict(list)

for d in (dict_1, dict_2):
    for k, v in d.items():
        final_dict[k].append(v)

或者等效地with itertools.chain,您只需将循环更改为:

from itertools import chain

for k, v in chain(dict_1.items(), dict_2.items()):
    final_dict[k].append(v)

旁注:如果您确实需要最后使它成为适当的dict,并且/或者坚持将值设为tuple而不是list,那么最后通行证可以在末尾转换成这样:

final_dict = {k: tuple(v) for k, v in final_dict.items()}

答案 1 :(得分:1)

您可以使用设置的按键交集来做到这一点:

dict_1 = {('sample 1','domain 1'): 'value 1', ('sample 1', 'domain 2'): 'value 1'} 
dict_2 = {('sample 1','domain 1'): 'value 2', ('sample 1', 'domain 2'): 'value 2'} 

result = {k: (dict_1.get(k), dict_2.get(k)) for k in dict_1.keys() & dict_2.keys()}

print(result)
# {('sample 1', 'domain 1'): ('value 1', 'value 2'), ('sample 1', 'domain 2'): ('value 1', 'value 2')}

上面使用dict.get()来避免引发KeyError的可能性(极不可能),因为默认情况下它将仅返回None

@ShadowRanger在评论中所建议,如果由于某种原因未找到键,则可以从相反的字典中替换:

{k: (dict_1.get(k, dict_2.get(k)), dict_2.get(k, dict_1.get(k))) for k in dict_1.keys() | dict_2.keys()}

答案 2 :(得分:0)

像这样手工制作的东西对您有用吗?

dict3 = {} 
for i in dict1: 
    dict3[i] = (dict1[i], dict2[i]) 

答案 3 :(得分:-1)

from collections import defaultdict
from itertools import chain
dict_1 = {('sample 1','domain 1'): 1, ('sample 1', 'domain 2'): 2} 
dict_2 = {('sample 1','domain 1'): 3, ('sample 1', 'domain 2'): 4}

new_dict_to_process = defaultdict(list)
dict_list=[dict_1.items(),dict_2.items()]
for k,v in chain(*dict_list):
     new_dict_to_process[k].append(v)

输出将为

{('sample 1', 'domain 1'): [1, 3],
 ('sample 1', 'domain 2'): [2, 4]})