[英]Why doesn't igraph's add_vertices() work with a set of strings?
這無疑是由於我對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
是一個有效的字符串迭代。 我的錯誤在哪里?
來自igraph 源 :
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完成的,它只會通過拆箱 -但GraphBase
該Graph
類的子類是寫在c。
所以這種行為只能用結果來描述。 如果你傳遞一個無序的iterable
( set
和dict
),頂點序列的每個屬性都將iterable
本身作為值,但是如果你傳遞一個有序的iterable(比如tuple
或list
),那么這些值將被解包 (不是在python意義上)並分配給那片vs
您可以通過重復以下代碼段來確認這一點:
verts = ('1','2','3') # ordered
和
verts = {'1': 'one' ,'2': 'two', '3': 'three'} # unordered
但是frozensets
嗎?
好的frozensets
是可訂閱的,所以C代碼只會重復與set
相同的行為。
我認為
verts
是一個有效的字符串迭代
但對Python中的索引無效。 我想文檔需要整容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.