合并嵌套的DefaultDict

2024-10-02 10:19:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个:

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']

我想把两个defaultdict合并,结果是:

^{pr2}$

我不知道怎么得到这个结果。。我尝试过使用dict1.items()和dict2.items(),或者update函数,但是我一定遗漏了一些东西,因为我无法获得defaultdicts的“union”。在


Tags: lambda函数updateitemslistdefaultdictpr2dict1
2条回答

稍微“优雅点”:

uniondict = defaultdict(lambda:defaultdict(list))
for k1, v1 in dict1.items() + dict2.items():
    for k2, v2 in v1.items():
        uniondict[k1][k2] += v2

要获得更节省内存的解决方案:

^{pr2}$

这将使用迭代器来防止在内存中创建临时列表

itertools.chain docs


对于后代来说,这里有一个通用函数,它将合并嵌套的dictionary对象(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
dict12 = defaultdict(lambda:defaultdict(list))
for k,v in dict1.items():
    for k1,v1 in v.items():
        dict12[k][k1] = v1
for k,v in dict2.items():
    for k2,v2 in v.items():
        dict12[k][k2] += v2
for k,v in dict12.items():
    for k12,v12 in v.items():
        print "dict12[%r][%r] = %r" % (k,k12,v12)

相关问题 更多 >

    热门问题