Kev*_*edo 2 python union data-structures defaultdict
我有这个:
dict1 = defaultdict(lambda:defaultdict(list))
dict1['rl1']['sh1'] = ['a','b']
dict1['rl1']['sh2'] = ['c','d']
dict1['rl2']['sh1'] = ['c','d']
dict2 = defaultdict(lambda:defaultdict(list))
dict2['rl1']['sh1'] = ['p','q']
dict2['rl1']['sh3'] = ['r','s']
dict2['rl3']['sh1'] = ['r','s']
Run Code Online (Sandbox Code Playgroud)
我想做两个默认配置的联合,这将是结果:
uniondict = defaultdict(lambda:defaultdict(list))
uniondict['rl1']['sh1'] = ['a','b','p','q']
uniondict['rl1']['sh2'] = ['c','d']
uniondict['rl1']['sh3'] = ['r','s']
uniondict['rl2']['sh1'] = ['c','d']
uniondict['rl3']['sh1'] = ['r','s']
Run Code Online (Sandbox Code Playgroud)
我不确定如何获得这个结果..我已经尝试使用dict1.items()和dict2.items(),或更新功能,但我必须遗漏一些东西,因为我无法得到"联盟"默认情况.
略微"优雅":
uniondict = defaultdict(lambda:defaultdict(list))
for k1, v1 in dict1.items() + dict2.items():
for k2, v2 in v1.items():
uniondict[k1][k2] += v2
Run Code Online (Sandbox Code Playgroud)
为了更节省内存的解决方案:
from itertools import chain
uniondict = defaultdict(lambda:defaultdict(list))
for k1, v1 in chain(dict1.iteritems(), dict2.iteritems()):
for k2, v2 in v1.iteritems():
uniondict[k1][k2] += v2
Run Code Online (Sandbox Code Playgroud)
这将使用迭代器来防止在内存中创建临时列表
对于后代,这里是一个泛型函数,它将合并嵌套的字典对象(defaultdict或no),其中第二层值支持+运算符.(列表,整数,集等):
from collections import defaultdict
from itertools import chain
def merge_nested_dicts(dict_list):
uniondict = defaultdict(lambda:defaultdict(list))
for k1, v1 in chain(*[d.iteritems() for d in dict_list]):
for k2, v2 in v1.iteritems():
uniondict[k1][k2] += v2
return uniondict
Run Code Online (Sandbox Code Playgroud)