<p>您可以尝试创建<a href="https://docs.python.org/3/library/collections.html#collections.defaultdict" rel="nofollow noreferrer">^{<cd1>}</a>个<a href="https://docs.python.org/3/library/collections.html#collections.Counter" rel="nofollow noreferrer">^{<cd2>}</a>对象,并在迭代两个graph dict时对边计数求和:</p>
<pre><code>from collections import defaultdict
from collections import Counter
from pprint import pprint
graph_to = {'a':{'b':2,'c':3},'b':{'a':1,'d':4}}
graph_from = {'a':{'b':1},'b':{'a':2},'c':{'a':3},'d':{'b':4}}
undirected_graph = defaultdict(Counter)
def sum_edges(graph, result):
for node, edges in graph.items():
for edge in edges:
result[node][edge] += edges[edge]
sum_edges(graph_to, undirected_graph)
sum_edges(graph_from, undirected_graph)
pprint(undirected_graph)
</code></pre>
<p>它给出:</p>
<pre><code>defaultdict(<class 'collections.Counter'>,
{'a': Counter({'b': 3, 'c': 3}),
'b': Counter({'d': 4, 'a': 3}),
'c': Counter({'a': 3}),
'd': Counter({'b': 4})})
</code></pre>
<p><strong>注意:</strong><code>Counter</code>和<code>defaultdict</code>是<code>dict</code>的子类,因此可以将它们视为普通词典。你知道吗</p>
<p>如果您真的想在最终无向图中使用普通词典,您可以使用以下任一dict理解:</p>
<pre><code>dict((k, dict(v)) for k, v in undirected_graph.items())
# {'a': {'b': 3, 'c': 3}, 'b': {'a': 3, 'd': 4}, 'c': {'a': 3}, 'd': {'b': 4}}
{k: dict(v) for k, v in undirected_graph.items()}
# {'a': {'b': 3, 'c': 3}, 'b': {'a': 3, 'd': 4}, 'c': {'a': 3}, 'd': {'b': 4}}
</code></pre>
<p>此外,您还可以在这里使用<a href="https://docs.python.org/3/library/stdtypes.html#dict.update" rel="nofollow noreferrer">^{<cd6>}</a>重构<code>sum_edges()</code>:</p>
<pre><code>def sum_edges(graph, result):
for node, edges in graph.items():
result[node].update(edges)
</code></pre>