在函数中使用错误的 networkx 前辈

Posted

技术标签:

【中文标题】在函数中使用错误的 networkx 前辈【英文标题】:Wrong networkx predecessors when used inside a function 【发布时间】:2022-01-01 22:28:30 【问题描述】:

我试图在图表G 中找到我的节点的父节点,但是当我在函数中使用predecessor 方法时,我的过滤方法返回错误的答案。

MWE:

import networkx as nx
G=nx.MultiDiGraph()
G.add_node("Z_1")
G.add_node("Z_0")
G.add_node("X_1")
G.add_edge('X_1','Z_1')
G.add_edge('Z_0','Z_1')

查找不同时间索引节点的简单函数:

def node_parents(node: str, temporal_index: int = None) -> tuple:
    #  Returns the parents of this node with optional filtering on the time-index.
    if temporal_index:
        # return (*[v for v in  G.predecessors(node) if v.split("_")[1] == str(temporal_index)],)
        return tuple(filter(lambda x: x.endswith(str(temporal_index)), G.predecessors(node)))
    else:
        return tuple(G.predecessors(node))

现在,让我们使用函数:

node_parents("Z_1",0)
>>>('X_1', 'Z_0')

好的。让我们在函数外的过滤器中使用predecessor 方法:

(*[v for v in G.predecessors('Z_1') if v.split("_")[1] == "0"],)
>>>('Z_0',)

在本例中,我要做的就是过滤掉索引为零的节点(即末尾有零的字符串)。但由于某种原因,我得到了不同的答案。这是为什么呢?

【问题讨论】:

A temporal_index 为零计算为假。你的意思是写if temporal_index is not None: 哦 ffs。很好,谢谢。 【参考方案1】:

感谢@Paul Brodersen,正确的写法是:

def node_parents(node: str, temporal_index: int = None) -> tuple:
    #  Returns the parents of this node with optional filtering on the time-index.
    if temporal_index is not None:
        # return (*[v for v in  G.predecessors(node) if v.split("_")[1] == str(temporal_index)],)
        return tuple(filter(lambda x: x.endswith(str(temporal_index)), G.predecessors(node)))
    else:
        return tuple(G.predecessors(node))

【讨论】:

以上是关于在函数中使用错误的 networkx 前辈的主要内容,如果未能解决你的问题,请参考以下文章

Python:获取所有节点的度数,然后在networkx中绘制箱线图

networkx 算法中是不是有一个函数可以返回我指定的某些节点周围的集团/集群/组件?

python-networkx学习

在 NetworkX 中绘制图形

NetworkX 递归子节点

如何使用 python 的 networkx 模块从节点列表生成完全连接的子图