construire un graphe de type de jeu de python
Question
La question courte, est-il un au large de la fonction d'auto pour faire un graphique à partir d'une collection de jeux de python? La question plus: J'ai plusieurs ensembles de python. Ils se chevauchent chaque ou certains sont sous ensembles d'autres. Je souhaite faire un graphique (comme dans les noeuds et arêtes) noeuds sont les éléments dans les ensembles. Les bords sont intersection des ensembles avec pondérée par le nombre d'éléments dans l'intersection des ensembles. Il y a plusieurs paquets pour python graphiques. (NetworkX, igraph, ...) Je ne suis pas au courant de l'utilisation de l'un d'eux. Est-ce que l'un d'eux faire un graphique directement à partir d'une liste des ensembles c.-à-MakeGraphfromSets (alistofsets) Sinon connaissez-vous d'un exemple de la façon de prendre la liste des jeux pour définir les bords. Il semble en fait que ça pourrait être simple, mais un exemple est toujours bon d'avoir.
La solution
Il est pas trop difficile pour vous le code:
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
Ce numéro de chaque fonction set et son index dans sets
. Nous faisons cela parce que les clés de dict doit être immuable, ce qui est vrai des entiers, mais pas ensembles.
Voici un exemple de la façon d'utiliser cette fonction, et sa sortie:
>>> 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)]}
Autres conseils
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
SORTIE:
(0, 0, 3)
(0, 1, 2)
(0, 2, 1)
(1, 1, 3)
(1, 2, 2)
(2, 2, 2)