Frage

Die kurze Frage, gibt es eine von der Selbstfunktion eine Grafik aus einer Sammlung von Python-Sets zu machen? Je länger Frage: Ich habe mehrere Python-Sets haben. Sie verfügen jeweils überlappen oder einige sind Untersätze von anderen. Ich möchte ein Diagramm machen (wie in den Knoten und Kanten) Knoten, die die Elemente in den Sätzen sind. Die Kanten sind Schnittpunkt der Sätze mit gewichtet durch die Anzahl von Elementen in dem Schnittpunkt der Sätze. Es gibt mehrere Grafikpakete für Python. (NetworkX, IGRAPH, ...) bin ich mit der Verwendung eines von ihnen nicht vertraut sind. Wird einer von ihnen einen Graphen direkt aus einer Liste machen von Sätzen, dh, MakeGraphfromSets (alistofsets) Wenn nicht wissen Sie, ein Beispiel dafür, wie die Liste der Sätze zu ergreifen, um die Kanten zu definieren. Es sieht tatsächlich aus wie es einfach sein könnte, aber ein Beispiel ist immer gut zu haben.

War es hilfreich?

Lösung

Es ist nicht allzu schwer zu Code selbst:

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

Diese Funktion Zahlen jeden Satz mit seinem Index innerhalb sets. Wir tun dies, weil dict Schlüssel unveränderlich sein muss, die von ganzen Zahlen ist wahr, aber nicht-Sets.

Hier ist ein Beispiel dafür, wie diese Funktion zu nutzen, und es ist Ausgabe:

>>> 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)]}

Andere Tipps

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top