【问题标题】:Combine similar nested dict's values into a new nested dict将相似的嵌套字典的值组合成一个新的嵌套字典
【发布时间】:2019-04-06 04:56:46
【问题描述】:

我必须使用的嵌套字典示例如下所示:

d1 = {'Breda': {'Fuery': {'anger': 1},
                       'Havoc': {'anticipation': 1, 'surprise': 1},
                       'Hawkeye': {'anticipation': 2}},
             'Fuery': {'Breda': {'anticipation': 2, 'surprise': 1},
                       'Mustang': {'fear': 4}},
             'Havoc': {'Breda': {'joy': 1},
                       'Gloria': {'joy': 1},
                       'Hawkeye': {'anticipation': 4, 'joy': 1, 'surprise': 1},
                       'Mustang': {'surprise': 1}},
             'Hawkeye': {'Hawkeye': {'joy': 2, 'trust': 1},
                         'Mustang': {'anger': 1,
                                     'joy': 6,
                                     'surprise': 4,
                                     'trust': 1}},
             'Mustang': {'Everyone': {'anger': 2},
                         'Fuery': {'anger': 3, 'surprise': 1},
                         'Hawkeye': {'anger': 1,
                                     'joy': 6,
                                     'surprise': 1,
                                     'trust': 1},
                         'Mustang': {'joy': 2, 'trust': 1},
                         'the team': {'anger': 1}}}

我正在尝试从中创建一个新的嵌套字典d2,新键是d1 最外层字典的键,然后每个键的值是值的组合所有内部d1 的键。

因此,例如,如果'anticipation' 出现在多个键中,则应将'anticipation' 的值相加。

所需的输出如下所示:

d2 = {'Breda': {'anger': 1, 'anticipation': 3, 'surprise': 1},
      'Fuery': {'anticipation': 2, 'surprise': 1, 'fear': 4},
      'Havoc': {'joy': 3, 'anticipation': 4, 'surprise': 2},
      'Hawkeye': {'joy': 8, 'trust': 2, 'anger': 1, 'surprise': 4}
      'Mustang': {'anger': 6, 'surprise': 2, 'joy': 8, 'trust': 2}}

到目前为止,我的这段代码并没有通过内部字典的所有键,而是输出最后一个的值:

from pprint import pprint

      # see d1 above

d2 = dict()

for key, value in d1.items():

    for k, v in value.items():
        d2[key] = v

pprint(d2) 

当前输出:

{'Breda': {'anticipation': 2},
 'Fuery': {'fear': 4},
 'Havoc': {'surprise': 1},
 'Hawkeye': {'anger': 1, 'joy': 6, 'surprise': 4, 'trust': 1},
 'Mustang': {'anger': 1}}

如何遍历 all 内部 dict 的键,然后比较值以将它们相加?

我希望我的问题很清楚。

任何形式的提示将不胜感激!

【问题讨论】:

    标签: python dictionary nested key-value


    【解决方案1】:

    您可以在内部字典的值上使用Counter

    from collections import Counter
    
    d1 = {'Breda': {'Fuery': {'anger': 1},
                    'Havoc': {'anticipation': 1, 'surprise': 1},
                    'Hawkeye': {'anticipation': 2}},
          'Fuery': {'Breda': {'anticipation': 2, 'surprise': 1},
                    'Mustang': {'fear': 4}},
          'Havoc': {'Breda': {'joy': 1},
                    'Gloria': {'joy': 1},
                    'Hawkeye': {'anticipation': 4, 'joy': 1, 'surprise': 1},
                    'Mustang': {'surprise': 1}},
          'Hawkeye': {'Hawkeye': {'joy': 2, 'trust': 1},
                      'Mustang': {'anger': 1,
                                  'joy': 6,
                                  'surprise': 4,
                                  'trust': 1}},
          'Mustang': {'Everyone': {'anger': 2},
                      'Fuery': {'anger': 3, 'surprise': 1},
                      'Hawkeye': {'anger': 1,
                                  'joy': 6,
                                  'surprise': 1,
                                  'trust': 1},
                      'Mustang': {'joy': 2, 'trust': 1},
                      'the team': {'anger': 1}}}
    
    result = {key: dict(sum(map(Counter, inner.values()), Counter())) for key, inner in d1.items()}
    
    print(result)
    

    输出

    {'Havoc': {'joy': 3, 'surprise': 2, 'anticipation': 4}, 'Mustang': {'joy': 8, 'trust': 2, 'anger': 7, 'surprise': 2}, 'Hawkeye': {'joy': 8, 'surprise': 4, 'anger': 1, 'trust': 2}, 'Breda': {'surprise': 1, 'anger': 1, 'anticipation': 3}, 'Fuery': {'fear': 4, 'surprise': 1, 'anticipation': 2}}
    

    语句sum(map(Counter, inner.values()), Counter()) 将每个内部字典转换为一个计数器,然后使用sum 将它们组合在一起。之所以可以这样做,是因为 Counter 实现了加法,例如:

    Counter({'anticipation': 2}) + Counter({'anticipation': 1, 'surprise': 1})
    

    返回:

    Counter({'anticipation': 3, 'surprise': 1})
    

    更新

    如果您想要每个键的总数,只需添加以下行:

    total = { key : sum(inner.values()) for key, inner in result.items() }
    print(total)
    

    输出

    {'Hawkeye': 15, 'Mustang': 19, 'Fuery': 7, 'Havoc': 9, 'Breda': 5}
    

    【讨论】:

    • 很好的答案!谢谢! :) - 如果我要求不高:是否有可能为每个单独的键输出所有整数的总和?例如Havoc: 9, Mustang: 19
    • @Waldkamel 更新了答案!
    猜你喜欢
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多