2010-03-19 4 views
0

La question courte, y a-t-il une fonction de self pour faire un graphe à partir d'une collection d'ensembles de pythons? La question la plus longue: j'ai plusieurs ensembles de pythons. Ils se chevauchent ou certains sont des sous-ensembles d'autres. Je voudrais faire un graphique (comme dans les noeuds et les bords) les noeuds sont les éléments dans les ensembles. Les arêtes sont l'intersection des ensembles pondérés par le nombre d'éléments à l'intersection des ensembles. Il y a plusieurs paquets graphiques pour python. (NetworkX, igraph, ...) Je ne suis pas familier avec l'utilisation de l'un d'entre eux. Est-ce que l'un d'eux fera un graphique directement à partir d'une liste d'ensembles, c'est-à-dire, MakeGraphfromSets (alistofsets) Si non, connaissez-vous un exemple de la façon de prendre la liste des ensembles pour définir les bords. En fait, il semble que ce soit simple, mais un exemple est toujours bon à avoir.construire un graphe à partir de python définir le type

+0

On ne sait pas ce que votre ensemble d'ensembles décrit . Un ensemble est-il une collection de nœuds connectés? Si non, comment les bords sont-ils encodés? Un exemple serait utile pour répondre à votre question. – msw

+0

Une image vaut 1000 mots. Soit nous donner l'autre 868 mots ou une sorte d'exemple :) –

+0

Pouvez-vous s'il vous plaît nettoyer votre grammaire et l'orthographe? La première partie de votre question est presque illisible. – allyourcode

Répondre

1

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 nombre de fonctions avec son chaque jeu index dans sets. Nous faisons cela parce que les clés dict doivent être immuables, ce qui est vrai pour les entiers mais pas pour les 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)]} 
1

 

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) 
Questions connexes