毫无疑问,由于我缺乏对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
是一个有效的字符串迭代。我的错误在哪里?
答案 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
。
所以这种行为只能用结果来描述。如果您传递了无序的iterable
(set
和dict
),则顶点序列的每个属性都将iterable
本身作为值,但如果传递有序的可迭代(例如tuple
或list
),值解压缩(不是在python意义上)并分配给vs
的那一片。
您可以通过重复以下代码段来确认这一点:
verts = ('1','2','3') # ordered
和
verts = {'1': 'one' ,'2': 'two', '3': 'three'} # unordered
但是frozensets
?
好frozensets
也不可订阅,因此C代码只会重复与set
相同的行为。
我认为
verts
是一个有效的字符串迭代
但对Python中的索引无效。我想文档需要整容。