2010-03-19 87 views
0

簡短的問題是,有沒有一個關於從python集合中創建圖形的自我函數? 更長的問題:我有幾個python集。它們各自重疊或者一些是其他的子集。我想做一個圖(如在節點和邊)節點是集中的元素。這些邊是這些集合的交集,這些集合由這些集合的交集中的元素的數量加權。有幾個python圖形包。 (NetworkX,igraph,...)我不熟悉它們中的任何一個的用法。他們中的任何一個都會從一組列表中直接創建一個圖形,即MakeGraphfromSets(alistofsets) 如果不是你知道如何獲取集合列表來定義邊緣的例子。它實際上看起來可能是直線前進,但一個例子總是很好。python集合類型的構造圖

+0

目前還不清楚你的套集介紹。是一組連接節點的集合嗎?如果不是,如何編碼邊緣?一個例子將有助於回答你的問題。 – msw 2010-03-19 05:49:56

+0

一張圖片勝過1000字。要麼給我們其他868字或某種例子:) – 2010-03-19 06:01:38

+0

你能清理你的語法和拼寫嗎?你的問題的第一部分幾乎是不可讀的。 – allyourcode 2010-03-19 06:05:02

回答

1

這不是太難自己的代碼:

def intersection_graph(sets): 
    adjacency_list = {} 
    for i, s1 in enumerate(sets): 
     for j, s2 in enumerate(sets): 
      if j == i: 
       continue 
      try: 
       lst = adjacency_list[i] 
      except KeyError: 
       adjacency_list[i] = lst = [] 
      weight = len(s1.intersection(s2)) 
      lst.append((j, weight)) 
    return adjacency_list 

此功能的數字各設置有它內sets指數。我們這樣做是因爲字典鍵必須是不可變的,這是整數但不是集合。

這裏有一個如何使用這個功能的例子,它的輸出:

>>> sets = [set([1,2,3]), set([2,3,4]), set([4,2])] 
>>> intersection_graph(sets) 
{0: [(1, 2), (2, 1)], 1: [(0, 2), (2, 2)], 2: [(0, 1), (1, 2)]} 
1

 

def MakeGraphfromSets(sets): 
    egs = [] 
    l = len(sets) 
    for i in range(l): 
     for j in range(i,l): 
      w = sets[i].intersection(sets[j]) 
      egs.append((i,j,len(w))) 
    return egs 

# (source set index,destination set index,length of intersection) 

sets = [set([1,2,3]), set([2,3,4]), set([4,2])] 

edges = MakeGraphfromSets(sets) 

for e in edges: 
    print e 

OUTPUT:

(0, 0, 3) 
(0, 1, 2) 
(0, 2, 1) 
(1, 1, 3) 
(1, 2, 2) 
(2, 2, 2)