networkx - 如何编写算法来切割节点,同时保留 NetworkX 网络?
问题描述
假设我有一个如下的简单网络,并且我想在保留整体结构的同时删除小写节点。我怎么做?这是一些示例代码:
import networkx as nx
G = nx.DiGraph();
G.add_edge("A","b")
G.add_edge("b","C")
G.add_edge("b","D")
G.add_edge("D","e")
G.add_edge("e","F")
def printHackyDot(x):
for n in x.nodes():
for pre in x.predecessors(n):
print(pre + " -> " + n)
printHackyDot(G)
badNodes = [n for n in G.nodes if str.islower(n)]
运行这将产生:
A -> b
b -> C
b -> D
D -> e
e -> F
IE
如何编写 f(G) 以便获得类似的、简化的图形少小写节点:
A -> C
A -> D
D -> F
我尝试了以下方法,但是当您连续有两个小写字母时它会失败:
for badNode in [x for x in list(G.nodes) if str.islower(x)]:
R.remove_node(badNode)
for predNode in G.predecessors(badNode):
for succNode in G.successors(badNode):
R.add_edge(predNode,succNode)
解决方案
我假设R
开始时是G
?
如果您更换,这将起作用
for badNode in [x for x in list(G.nodes) if str.islower(x)]:
R.remove_node(badNode)
for predNode in G.predecessors(badNode):
for succNode in G.successors(badNode):
R.add_edge(predNode,succNode)
与(为过早删除错误而编辑badNode
)
for badNode in [x for x in list(R.nodes) if str.islower(x)]:
for predNode in R.predecessors(badNode):
for succNode in R.successors(badNode):
R.add_edge(predNode,succNode)
R.remove_node(badNode)
问题是当您连续处理两个小写节点中的第一个时,它会删除该节点。但是当你处理另一个时,它看到G
那个节点有一个小写的邻居,它把边缘放回去。如果你看看它的邻居,R
你会正确处理它。
推荐阅读
- python - 扫描字符串文字时出现 Python 语法错误 EOL - 为什么会发生以及如何解决?
- sql - 如何在 hive 中的 array_contains 函数中模式匹配字符串表达式?
- virtual-machine - 使用 VSphere ISO-builder 的打包程序中的显存参数
- android - 浓缩咖啡:RecyclerViewActions.actionOnItemAtPosition 不起作用
- jdbc - 当网络关闭时,我怎么知道 Connection.commit() 是否成功?
- python - python中的无限while循环,熊猫计算标准偏差
- javascript - Javascript:如何将反斜杠字符放在自己的字符串中?
- reactjs - GTM 无法在 React App 中对循环结构(SVGSVGElement)进行字符串化
- express - Sequelize - 通过匹配所有标签过滤 FindAll
- python - 如何在 pytest-django 中测试 model.Serializer?