我在这里看了几个问题,似乎没有一个问题。假设我有2个词典,它们是dict1
{'A': 25 , 'B': 41, 'C': 32}
和dict 2
{'A':21, 'B': 12, 'C':62}
我正在编写一个程序,我需要将这些程序与一个词典finaldict结合起来
{'A': [25 , 21], 'B': [41, 12], 'C': [32, 62]}
非常感谢任何帮助,我一直在努力,暂时无处可去
答案 0 :(得分:9)
这是通用版本。这可用于创建一个包含值作为列表的字典,即使该键仅存在于其中一个字典中。
dic1 = {'A': 25, 'B': 41, 'C': 32}
dic2 = {'A': 21, 'B': 12, 'C': 62}
result = {}
for key in (dic1.viewkeys() | dic2.keys()):
if key in dic1: result.setdefault(key, []).append(dic1[key])
if key in dic2: result.setdefault(key, []).append(dic2[key])
print result
<强>输出强>
{'A': [25, 21], 'C': [32, 62], 'B': [41, 12]}
如果您使用的是Python 3,则必须像这样更改for循环。感谢Martijn:)
for key in (dic1.keys() | dic2.keys()):
答案 1 :(得分:6)
如您所知,您的两个词典将始终具有相同的键,您可以使用:
finaldict = {key:(dict1[key], dict2[key]) for key in dict1}
组合它们,其中每个值都是源字典值的元组。
答案 2 :(得分:2)
这是一种方式,使用defaultdict
:
# the setup
>>> from collections import defaultdict
>>> dict1 = {'A': 25, 'B': 41, 'C': 32}
>>> dict2 = {'A': 21, 'B': 12, 'C': 62}
# the preperation
>>> dicts = [dict1, dict2]
>>> final = defaultdict(list)
# the logic
>>> for k, v in ((k, v) for d in dicts for k, v in d.iteritems()):
final[k].append(v)
# the result
>>> final
defaultdict(<type 'list'>, {'A': [25, 21], 'C': [32, 62], 'B': [41, 12]})
答案 3 :(得分:1)
def combineDict(dict1, dict2):
res = collections.defaultdict(list)
for key, value in (dict1.items() | dict2.items()):
res[key].append(value)
return res
print(combineDict(dict1, dict2))
答案 4 :(得分:0)
这是另一种方法,无论密钥是仅存在于一个字典还是两个字典中,它都能正常工作。
def merge_dicts(dict_a, dict_b):
merged_dict = {key: [value] for key, value in dict_a.iteritems()}
for key, value in dict_a.iteritems():
try:
merged_dict[key].append(value)
except KeyError:
meeged_dict[key] = [value]
return ret_dict
答案 5 :(得分:0)
我只需要合并一个未知数字词典,在看到这个问题的答案之后就会提出更通用的解决方案:
1)值词典:
dic1 = {'A': 1, 'B': 1, 'C': 1}
dic2 = {'A': 2, 'B': 2, 'C': 2}
dic3 = {'D': 3, 'E': 3, 'F': 3}
def combineDictVal(*args):
result = {}
for dic in args:
for key in (result.viewkeys() | dic.keys()):
if key in dic:
result.setdefault(key, []).append(dic[key])
return result
print combineDictVal(dic1, dic2, dic3)
<强>结果强>:
{'A': [1, 2], 'C': [1, 2], 'B': [1, 2], 'E': [3], 'D': [3], 'F': [3]}
2)列表词典(差异在追加/扩展*):
dic1 = {'A': [1, 2], 'B': [1, 2], 'C': [1, 2]}
dic2 = {'A': [3, 4], 'B': [3, 4], 'C': [3, 4]}
dic3 = {'D': [5, 6], 'E': [5, 6], 'F': [5, 6]}
def combineDictList(*args):
result = {}
for dic in args:
for key in (result.viewkeys() | dic.keys()):
if key in dic:
result.setdefault(key, []).extend(dic[key])
return result
print combineDictList(dic1, dic2, dic3)
<强>结果:强>
{'A': [1, 2, 3, 4], 'C': [1, 2, 3, 4], 'B': [1, 2, 3, 4], 'E': [5, 6], 'D': [5, 6], 'F': [5, 6]}
3) Universal for int / lists:
dic1 = {'A': 1, 'B': 1, 'C': [1, 1]}
dic2 = {'A': 2, 'B': [2, 2], 'C': 2}
dic3 = {'D': 3, 'E': 3, 'F': [3, 3]}
def combineDict(*args):
result = {}
for dic in args:
for key in (result.viewkeys() | dic.keys()):
if key in dic:
if type(dic[key]) is list:
result.setdefault(key, []).extend(dic[key])
else:
result.setdefault(key, []).append(dic[key])
return result
print combineDict(dic1, dic2, dic3)
结果:
{'A': [1, 2], 'C': [1, 1, 2], 'B': [1, 2, 2], 'E': [3], 'D': [3], 'F': [3, 3]}
这些解决方案并非最快,但它们很清晰,工作得很好。希望它会帮助别人。
答案 6 :(得分:0)
使用pydash
from pydash import merge_with
cbk = lambda obj_val, src_val: obj_val + src_val
obj1 = {'a': [1], 'b': [2]}
obj2 = {'a': [3], 'b': [4]}
res = merge_with(obj1, obj2, cbk)
print(res)
结果:
{'a': [1, 3], 'b': [2, 4]}
您还可以使用dictlib
import dictlib
obj1 = {'a': [1], 'b': [2]}
obj2 = {'a': [3], 'b': [4],"c":[3]}
c = dictlib.union_setadd(obj1, obj2)
print(c)
{'a': [1, 3], 'b': [2, 4], 'c': [3]}