繁体   English   中英

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

[英]Merging two dictionaries in Python with a key consisting of two values

我有类似的数据

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)}

-等

您可能最接近的是list (或set )的dict 为简单起见,通常使用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)

或等效地使用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()}

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

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()}

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

dict3 = {} 
for i in dict1: 
    dict3[i] = (dict1[i], dict2[i]) 
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]})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM