为什么igraph的add_vertices()不能使用一组字符串?

时间:2016-06-23 10:30:33

标签: python igraph

毫无疑问,由于我缺乏对Python的了解......但为什么这不适用于igraph?

import igraph
g=igraph.Graph()
verts = {'1','2','3'}
g.add_vertices(verts)
for v in g.vs:
    print v

输出:

igraph.Vertex(<igraph.Graph object at 0x106347908>,0,{'name': set(['1', '3', '2'])})
igraph.Vertex(<igraph.Graph object at 0x106347908>,1,{'name': set(['1', '3', '2'])})
igraph.Vertex(<igraph.Graph object at 0x106347908>,2,{'name': set(['1', '3', '2'])})

我原本期望得到以下输出(我用add_vertices(list(verts))得到):

igraph.Vertex(<igraph.Graph object at 0x106347af8>,0,{'name': '1'})
igraph.Vertex(<igraph.Graph object at 0x106347af8>,1,{'name': '3'})
igraph.Vertex(<igraph.Graph object at 0x106347af8>,2,{'name': '2'})

add_vertices上的文档说明了

  

add_vectirces(n) n - 要添加的顶点数,或要添加的单个顶点的名称,或可迭代的字符串,每个字符串对应于要添加的顶点的名称。名称将分配给名称vertex属性。

我认为verts是一个有效的字符串迭代。我的错误在哪里?

1 个答案:

答案 0 :(得分:3)

来自igraph source

def add_vertices(self, n): 
     if isinstance(n, basestring):
          # some code
     elif hasattr(n, "__iter__"): 
          m = self.vcount() 
          if not hasattr(n, "__len__"): 
               names = list(n) 
          else: 
               names = n 
          result = GraphBase.add_vertices(self, len(names)) 
          self.vs[m:]["name"] = names # assignment is done here
          return result

将顶点序列切片中每个顶点的name属性分配给names中的值似乎是合理的 - 如果这是在纯Python中完成的,它将简单地传递为< em> unpacking - 但GraphBase类子类是用c编写的Graph

所以这种行为只能用结果来描述。如果您传递了无序的iterablesetdict),则顶点序列的每个属性都将iterable本身作为值,但如果传递有序的可迭代(例如tuplelist),值解压缩(不是在python意义上)并分配给vs的那一片。

您可以通过重复以下代码段来确认这一点:

verts = ('1','2','3') # ordered

verts = {'1': 'one' ,'2': 'two', '3': 'three'} # unordered

但是frozensets

frozensets也不可订阅,因此C代码只会重复与set相同的行为。

  

我认为verts是一个有效的字符串迭代

但对Python中的索引无效。我想文档需要整容。