我有类似-
的数据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)}
-等等
答案 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]})