python - 如何在不使用networkx包的情况下检查字典是否代表图形?
问题描述
以下是一些示例字典:
G = {0:[1,2], 1:[0], 2:[0]}
V = {0:[0,2], 1:[0], 2:[0]}
W = {0:[1,2], 1:[4], 2:[0]}
X = {0:[2], 1:[0], 2:[0]}
Y = [2,3,4]
为了检查它们是否代表一个图,我试图检查没有节点将自己作为邻居,列出为邻居的唯一事物是有效节点,如果a有b作为邻居,那么b也有a作为邻居,并且所有对象都是适当的类型。
def IsItAGraph(D):
if type(D) is dict:
for x in D.keys():
if x not in D[x]:
for y in D[x]:
if y in D.keys():
if y in D[x]:
if x in D[y]:
return True
else:
return False
else:
return False
else:
return False
else:
return False
N = [IsItAGraph(Y), IsItAGraph(G), IsItAGraph(V), IsItAGraph(W), IsItAGraph(X)]
当我将其作为输入发送时,我会得到True
字典G
和所有其他字典的输出X
,除了.False
False
G
我做错了什么?
解决方案
您可以编写一个函数来检查您的每个要求
def valid_graph(g):
for key, value in g.items():
# Is key correct type
if not isinstance(key, (int, str)):
return False
# Are all values correct type
if not isinstance(value, list):
return False
if not all(isinstance(i, int) for i in value):
return False
# Do all values refer to a key in the graph
if not all(i in g.keys() for i in value):
return False
# Do any keys have themself as a neighbor
if any(i == key for i in value):
return False
# Do these neighbors refer back to this node
if not all(key in g[i] for i in value):
return False
# All checks succeeded
return True
然后例如
>>> valid_graph({0:[1,2], 1:[0], 2:[0]})
True
>>> valid_graph({0:[1,0], 1:[0], 2:[0]}) # 0 links to itself
False
>>> valid_graph({0:['str'], 1:[0], 2:[0]}) # invalid value type
False
>>> valid_graph({0:[2], 1:[0], 2:[0]}) # 1->0 but no 0->1
False
另外要明确一点,我基本上遵循了您问题中的要求,但这些不一定是所有图表的要求。例如
- 有向图可以有一个节点指向一个邻居,但该邻居不必指向该节点
- 图可能有循环,包括指向自身的节点
- 一个节点可以简单地终止而不指向任何其他节点
推荐阅读
- javascript - 添加消息作者以存储变量以供以后调用
- azure - 具有虚拟网络网关的专用终结点
- tensorflow - 卷积网络与小信号特征
- vue.js - 如何在 Vue 本地数据对象中获取 Vuex getter 的值
- fix-protocol - 如果 ResendRequest 丢失或发起者无法回答会发生什么?
- python-3.x - Pyspark - java.lang.OutOfMemoryError:写入 csv 文件时的 Java 堆空间
- html - 需要有关 Bootstrap 翻转卡定位选项的帮助
- python - 使用 boost/python 从 C++ 初始化一个 python 对象返回 None
- reactjs - 重新加载部署在 github 页面上的 reactjs 站点时出现 404 错误
- typescript - 如何在循环中导入类并执行导入类的功能