将相似的嵌套字典的值组合成一个新的嵌套字典

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


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}}}

我正在尝试从中创建一个新的嵌套 dict d2,新键是 最外层 dict 的键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) 



泛舟湖上清波郎朗
浏览 142回答 1
1回答

开心每一天1111

您可以对内部字典的值使用Counter:from collections import Counterd1 = {'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())将每个内部字典转换为一个 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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python