<p>这应该行得通</p>
<pre><code>a = {114907: {114905: 1.4351310915,
114908: 0.84635577943,
114861: 61.490648372},
113820: {113826: 8.6999361654,
113819: 1.1412795216,
111068: 1.1964946282,
117066: 1.5595617822,
113822: 1.1958951003},
114908: {114906: 1.279878388,
114907: 0.77568252572,
114862: 2.5412545474}
}
# Lets call the keys leaders and its value is a dict of
# keys ( call them members ) to floats.
# if a member is also a leader, then the two leaders combine.
leaders = set(a.keys())
leaders_to_members = { leader: set(member_dict.keys()) for leader, member_dict in a.items() }
seen_leaders =set()
b = {}
for leader, members in leaders_to_members.items():
if leader in seen_leaders:
continue
members_as_leaders = members.intersection(leaders)
members_as_leaders.add(leader)
v = {}
for member_leader in members_as_leaders:
v.update(a[member_leader])
seen_leaders.update(members_as_leaders)
# if its just one element, you want it as the key directly
b_key = tuple(members_as_leaders) if len(members_as_leaders) > 1 else members_as_leaders.pop()
# as per your output, you've removed the key to float value if it is a leader
b_val = { k: float_val for k, float_val in v.items() if k not in members_as_leaders }
b[b_key] = b_val
print(b)
</code></pre>
<p>输出</p>
^{2}$
<blockquote>
<p>The side question: why does pop in dictionaries return the value only and not the key: value pair?</p>
</blockquote>
<pre><code>>>> a.pop()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pop expected at least 1 arguments, got 0
>>> help(a.pop)
"""
Help on built-in function pop:
pop(...) method of builtins.dict instance
D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
If key is not found, d is returned if given, otherwise KeyError is raised
"""
</code></pre>
<p>如您所见,pop需要键,因此它可以弹出值。既然你需要给它钥匙,它就不必把钥匙还给你。在</p>