construir el gráfico de pitón tipo de conjunto
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.
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)