Pregunta

La pregunta corta, ¿hay un fuera de la función de auto para hacer una gráfica de una colección de conjuntos de pitón? La pregunta ya: Tengo varios juegos de pitón. Cada uno de ellos se superponen o alguna son subconjuntos de los demás. Quisiera hacer un gráfico (como en los nodos y los bordes) nodos son los elementos en los conjuntos. Los bordes son intersección de los conjuntos con ponderada por número de elementos en la intersección de los conjuntos. Hay varios paquetes de gráficos de pitón. (NetworkX, igraph, ...) No estoy familiarizado con el uso de cualquiera de ellos. ¿Alguno de ellos hacer una gráfica directamente de una lista de conjuntos es decir, MakeGraphfromSets (alistofsets) Si no lo sabes de un ejemplo de cómo tomar la lista de conjuntos para definir los bordes. En realidad, parece que podría ser simple, pero es un ejemplo siempre es bueno tener.

¿Fue útil?

Solución

No es demasiado difícil de codificar a sí mismo:

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

Este números de función cada conjunto con su índice dentro sets. Hacemos esto porque las claves de diccionario deben ser inmutables, lo cual es cierto de números enteros pero no juegos.

Este es un ejemplo de cómo utilizar esta función, y su salida:

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

Otros consejos

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

Salida:

(0, 0, 3)
(0, 1, 2)
(0, 2, 1)
(1, 1, 3)
(1, 2, 2)
(2, 2, 2)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top