我太困惑了,无法提出正确的方法来做到这一点:

我有这个有向图:
python - 从有向图创建无向图-LMLPHP

并有两个字典,分别显示出局和入局分数

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


例如,在graph_to中,节点a进入得分为2的节点b,然后进入得分为3的节点c。在graph_from中,节点a从节点b接收分数1。

我想创建undirected graph以便总结两个节点之间的分数。它应该成为这个字典:

graph = {
    'a':{'b':3,'c':3},
    'b':{'a':3,'d':4},
    'c':{'a':3},
    'd':{'b':4}
}


python - 从有向图创建无向图-LMLPHP

最佳答案

您可以尝试对collections.defaultdict()个对象进行collections.Counter()运算,并在迭代两个图格时求和边计数:

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)


这使:

defaultdict(<class 'collections.Counter'>,
            {'a': Counter({'b': 3, 'c': 3}),
             'b': Counter({'d': 4, 'a': 3}),
             'c': Counter({'a': 3}),
             'd': Counter({'b': 4})})


注意:Counterdefaultdictdict的子类,因此您可以将它们与普通词典一样对待。

如果您确实想要最终无向图中的普通字典,则可以使用以下dict理解中的任何一种:

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


此外,您还可以在此处使用dict.update()重构sum_edges()

def sum_edges(graph, result):
    for node, edges in graph.items():
        result[node].update(edges)

关于python - 从有向图创建无向图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53773795/

10-12 18:29