繁体   English   中英

给定List创建无向图

[英]Creating an undirected graph given a List

我有一个清单:

entry=['A','B','C','null','B','A','D','null','E','F']

彼此相邻的字母(顶点)形成边缘。 'null'是一个分隔符。

每个边缘具有重量1.边缘(A,B)具有重量2,因为它发生两次。

为了可视化,上面的列表将是这个图: 在此输入图像描述

我想创建一个类似于邻接列表的字典。

dict= {
'A':{'B':2,'D',1},
'B':{'A':2,'C':1},
'C':{'B':1},
'D':{'A':1},
'E':{'F':1},
'F':{'E':1}
}

在第一个键是顶点的情况下,第二个键是具有其权重值的相邻顶点。

如何拿出上面的图表。 如果有任何其他更好的方式来表示上图,我会感激任何帮助。

一种解决方案是将entry列表reduce到图表字典,因为reduce(没有累加器)一次查看2个相邻元素:

from functools import reduce

graph = {}

def add_edge(u, v):
    if u != 'null' and v != 'null':
        if u in graph:
            graph[u][v] = graph[u].get(v, 0) + 1
        else:
            graph[u] = {v: 1}
        if v in graph:
            graph[v][u] = graph[v].get(u, 0) + 1
        else:
            graph[v] = {u: 1}
    return v

entry = ['A','B','C','null','B','A','D','null','E','F']
reduce(add_edge, entry)

print(graph)
# {'B': {'A': 2, 'C': 1}, 'E': {'F': 1}, 'F': {'E': 1}, 'C': {'B': 1}, 'A': {'B': 2, 'D': 1}, 'D': {'A': 1}}

编辑

一种“更纯粹”的减少方法是将相邻元素压缩在一起然后用初始化器减少:

def add_edge(graph, edges):
    u, v = edges
    if u != 'null' and v != 'null':
        # ... same thing as before
    return graph

entry = ['A','B','C','null','B','A','D','null','E','F']
graph = reduce(add_edge, zip(entry[:-1], entry[1:]), {})

@slider回答小猪支持,你也可以使用map (内置,不需要导入):

graph = {}
def add_edge(l):
    u, v = l[0], l[1]
    if u != 'null' and v != 'null':
        if u in graph:
            graph[u][v] = graph[u].get(v, 0) + 1
        else:
            graph[u] = {v: 1}
        if v in graph:
            graph[v][u] = graph[v].get(u, 0) + 1
        else:
            graph[v] = {u: 1}
    return v

list(map(add_edge, [entry[i:i+2] for i in range(len(entry) - 1)]))

>>> graph
{'A': {'B': 2, 'D': 1},
 'B': {'A': 2, 'C': 1},
 'C': {'B': 1},
 'D': {'A': 1},
 'E': {'F': 1},
 'F': {'E': 1}}

使用list(map(func..))的原因是因为对于python 3, map返回生成器而不是执行,因此必须使用list来强制它执行。 该行的输出对我们不感兴趣。 如果你正在使用python 2,那么你可以使用map(func..)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM