0

簡単な質問ですが、Pythonセットのコレクションからグラフを作成するためのオフセルフ関数はありますか?より長い質問:私はいくつかのPythonセットを持っています。それらはそれぞれ重複しているか、一部は他のサブセットです。グラフを作成したい(ノードやエッジのように)ノードはセットの要素です。エッジは、セットの共通部分であり、セットの共通部分の要素数で重み付けされています。Python用のグラフ作成パッケージがいくつかあります。(NetworkX、igraph、...)私はそれらのいずれの使用にも慣れていません。それらのいずれかがセットのリストから直接グラフを作成しますか?つまり、MakeGraphfromSets(alistofsets)そうでない場合は、セットのリストを取得してエッジを定義する方法の例を知っていますか。実際には簡単に見えるかもしれませんが、例は常にあるとよいでしょう。

4

2 に答える 2

2

自分でコーディングするのはそれほど難しくありません。

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。これを行うのは、dictキーが不変でなければならないためです。これは整数には当てはまりますが、セットには当てはまりません。

この関数の使用方法の例とその出力は次のとおりです。

>>> 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)]}
于 2010-03-19T06:24:52.447 に答える
2

 

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

出力:

(0, 0, 3)
(0, 1, 2)
(0, 2, 1)
(1, 1, 3)
(1, 2, 2)
(2, 2, 2)
于 2010-03-19T09:48:32.473 に答える