簡體   English   中英

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

[英]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完成的,它只會通過拆箱 -但GraphBaseGraph類的子類是寫在c。

所以這種行為只能用結果來描述。 如果你傳遞一個無序的iterablesetdict ),頂點序列的每個屬性都將iterable本身作為值,但是如果你傳遞一個有序的iterable(比如tuplelist ),那么這些值將被解包 (不是在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM