2012-05-07 102 views
1

如果我想通过id顶点得到名字,我可以使用这个功能:VAS(g, "name",id) 但是如果我想以相反的方式,通过名称获得id,我该怎么做?如何按名称获取id顶点?

+0

我从来没有使用过'igraph',但是因为没有其他人回答过:在对文档进行快速检查之后,我认为我正确地说'VAS'在查找顶点的属性图形。如果你的问题是如何找到具有指定属性的特定值的顶点(或顶点)的ID,那么我想你可以遍历图中的所有顶点,检查属性并累积匹配的顶点列表准则。 –

回答

1

的igraph不提供,就其本身而言手段,以按名称查找顶点,并有很好的理由 - 从名称到ID映射是一个更具挑战性的问题,不是从ID来命名,这是映射一个简单的数组查找操作。您可以遍历所有顶点并停止在匹配的顶点,但对于大图(顶点数O(n)),这是无效的。更快的方法是使用某种关联数组数据结构,例如@ Jasc答案中的dict,并将名称用作键和ID作为值。 (如果你改变它,你需要保持这个索引与图形同步。)C自己或者标准C库没有提供这样的数据结构,但是有很多实现可用,例如发现的GHash structure巧舌如簧。

+0

+1;这正是我作为igraph作者之一写的内容。我只补充说可以替换igraph的默认属性处理程序,因此OP理论上可以扩展igraph的默认属性处理机制,以便它自动维护名称到ID的反向映射。但是这不是在核心库中实现的。 –

+0

好的,非常感谢您的意见,我会尝试 – user1310873

0

我在igrah网站或邮件列表中发现了以下内容。

g = igraph.Graph(0, directed=True) 
g.add_vertices(2) 
g.vs[0]["name"] = "Bob" 
g.vs[1]["name"] = "Bill" 
# build a dict for all vertices to lookup ids by name 
name2id = dict((v, k) for k, v in enumerate(g.vs["name"])) 
# access specific vertices like this: 
id_bob = name2id["Bob"] 
print(g.vs[id_bob]["name"]) 
+0

这看起来像Python,它看起来不错,但原始海报标记了问题“C”或“C++” – gcbenison