如何连接或组合两个具有重叠键的默认值的默认值?

时间:2015-07-04 01:33:16

标签: python python-2.7 dictionary key defaultdict

使用提供的here建议,并且两个收入表必须从中提取(包含相同的水果但不同的品牌):

enter image description here

enter image description here

我结束了两个defaultdicts defaultdicts

D1

defaultdict(<function <lambda> at 0x105dd42a8>, {u'Kiwi': defaultdict(<type 'int'>, {u'NZKiwi': 1.2}), u'Pear': defaultdict(<type 'int'>, {u'PearShaped': 6.2}), u'Banana': defaultdict(<type 'int'>, {u'BananaBrand': 4.0, u'OtherBrand': 3.2}), u'Apple': defaultdict(<type 'int'>, {u'CrunchApple': 1.7})})

D2

defaultdict(<function <lambda> at 0x105dd41b8>, {u'Kiwi': defaultdict(<type 'int'>, {u'n': 1.2}), u'Pear': defaultdict(<type 'int'>, {u'p': 6.2}), u'Banana': defaultdict(<type 'int'>, {u'b': 4.0, u'o': 3.2}), u'Apple': defaultdict(<type 'int'>, {u'a': 1.7})})

假设为了论证我在上述处理之前无法组合这两个表,我现在如何组合这些默认值,以便维护密钥(水果类型),但是它们各自的值会被连接起来,键?换句话说,我如何得到以下结论:

defaultdict(<function <lambda> at 0x105dd41b8>, {u'Kiwi': defaultdict(<type 'int'>, {u'n': 1.2, u'NZKiwi': 1.2}), u'Pear': defaultdict(<type 'int'>, {u'p': 6.2, u'PearShaped': 6.2}), u'Banana': defaultdict(<type 'int'>, {u'b': 4.0, u'o': 3.2, u'BananaBrand': 4.0, u'OtherBrand': 3.2}}), u'Apple': defaultdict(<type 'int'>, {u'a': 1.7, u'CrunchApple': 1.7})})

实际上它并不一定要采取这种结构 - 我真正需要的是能够从中提取单个品牌数量对的东西,每个产品。所以最终结果是Banana包含4个品牌数量对的结果,另一个包含两个品牌数量对的Kiwi的单词。

更新:我可以做到以下几点,但肯定有更清洁的方法吗?

BananaDict = {}
KiwiDict ={}
AppleDict = {}
PearDict = {}

for k, v in d1.iteritems():
    if k == 'Banana':
        BananaDict.update(v)
    elif k == 'Kiwi'
    etc.
    etc.

然后重复上面的d2。

2 个答案:

答案 0 :(得分:1)

你可以使用一个简单的for循环,例如 -

>>> d = defaultdict(int, {u'Kiwi': defaultdict(int, {u'NZKiwi': 1.2}), u'Pear': defaultdict(int, {u'PearShaped': 6.2}), u'Banana': defaultdict(int, {u'BananaBrand': 4.0, u'OtherBrand': 3.2}), u'Apple': defaultdict(int, {u'CrunchApple': 1.7})})
>>> d1 = defaultdict(int, {u'Kiwi': defaultdict(int, {u'n': 1.2}), u'Pear': defaultdict(int, {u'p': 6.2}), u'Banana': defaultdict(int, {u'b': 4.0, u'o': 3.2}), u'Apple': defaultdict(int, {u'a': 1.7})})
>>> for k,v in d.items():
...     v.update(d1[k])
...
>>> d
defaultdict(<class 'int'>, {'Banana': defaultdict(<class 'int'>, {'o': 3.2, 'OtherBrand': 3.2, 'BananaBrand': 4.0, 'b': 4.0}), 'Pear': defaultdict(<class 'int'>, {'PearShaped': 6.2, 'p': 6.2}), 'Kiwi': defaultdict(<class 'int'>, {'NZKiwi': 1.2, 'n': 1.2}), 'Apple': defaultdict(<class 'int'>, {'a': 1.7, 'CrunchApple': 1.7})})

答案 1 :(得分:1)

我注意到另一个答案没有说明新字典具有原始字典没有的密钥的情况。

def merge_defaultdicts(d,d1):
    for k,v in d1.items():
        if (k in d):
            d[k].update(d1[k])
        else:
            d[k] = d1[k]
    return d