gpt4 book ai didi

python - 合并嵌套的 defaultdict

转载 作者:行者123 更新时间:2023-11-28 19:50:34 33 4
gpt4 key购买 nike

我有这个:

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 进行联合,这将是结果:

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

我不确定如何获得这个结果。我试过使用 dict1.items() 和 dict2.items() 或更新函数,但我一定是遗漏了一些东西,因为我无法获得defaultdict 的“联合”。

最佳答案

稍微“优雅”一些:

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

为了更节省内存的解决方案:

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

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

itertools.chain docs


为了后代,这里有一个通用函数,它将合并嵌套的字典对象(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

关于python - 合并嵌套的 defaultdict,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10820936/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com