从有向图生成无向图

2024-09-29 02:29:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是太糊涂了,想不出合适的方法:

我有一个有向图: enter image description here

有两本字典,上面有出分数和进分数

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

enter image description here


Tags: to方法from字典节点分数graph本词典
2条回答

我希望我们喜欢自己动手,这里有简单的逻辑

    out_dict = {}
    for key in graph_to : 
        for sub_key in graph_to[key]:
            if  key in graph_from and sub_key in graph_from[key]:
                    out_dict[key] = {sub_key: graph_to[key][sub_key] + graph_from[key][sub_key]}
            else:
                    out_dict[key].update({sub_key: graph_to[key][sub_key]})
    graph_from.update(out_dict)
    print(graph_from)

输出:

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

您可以尝试创建^{}^{}对象,并在迭代两个graph dict时对边计数求和:

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

此外,您还可以在这里使用^{}重构sum_edges()

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

相关问题 更多 >