[英]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.