将相似的嵌套字典的值组合成一个新的嵌套字典
Combine similar nested dict's values into a new nested 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}}}
我正在尝试从中创建一个新的嵌套字典 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}}
如何遍历 所有 内部字典的键,然后比较值以将它们相加?
我希望我的问题很清楚。
如有任何提示,我们将不胜感激!
您可以对内部字典的值使用 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})
returns:
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}
我必须使用的嵌套字典示例如下所示:
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}}
如何遍历 所有 内部字典的键,然后比较值以将它们相加?
我希望我的问题很清楚。
如有任何提示,我们将不胜感激!
您可以对内部字典的值使用 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})
returns:
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}