首页 > 解决方案 > 在 Python 中使用由两个值组成的键合并两个字典

问题描述

我有这样的数据——

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} 

- ETC。

现在,我有一个不同的值,命名为值 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)}

- ETC。

标签: pythondictionary

解决方案


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

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在最后是一个正确的,和/或坚持值是tuples 而不是lists,最后的 pass 可以在最后转换为这样的:

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

推荐阅读