2010-03-19 4 views
0

Короткий вопрос: есть ли функция self для создания графика из набора наборов python? Более длинный вопрос: у меня есть несколько наборов python. Каждый из них накладывается друг на друга или некоторые из них являются подмножествами других. Я хотел бы сделать граф (как в узлах и ребрах), узлы - это элементы в наборах. Края - это пересечение множеств, взвешенных по числу элементов в пересечении множеств. Существует несколько графических пакетов для python. (NetworkX, igraph, ...) Я не знаком с использованием каких-либо из них. Будет ли какой-либо из них создавать граф непосредственно из списка множеств, т.е. MakeGraphfromSets (alistofsets) Если вы не знаете пример того, как взять список наборов для определения ребер. На самом деле это выглядит так, как будто это может быть прямо, но пример всегда хорош.построить график из набора типов python

+0

Неясно, что ваш набор множеств описывает , Является ли набор совокупностью связных узлов? Если нет, то как кодируются края? Пример будет полезен для ответа на ваш вопрос. – msw

+0

Картина стоит 1000 слов. Или дайте нам другие 868 слов или какой-то пример :) –

+0

Можете ли вы, пожалуйста, очистить свою грамматику и орфографию? Первая часть вашего вопроса почти нечитаема. – allyourcode

ответ

1

Это не слишком сложно, чтобы закодировать себя: номер

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 

Этой функции каждый набор с индексом в sets. Мы делаем это, потому что ключи ключа должны быть неизменными, что верно для целых чисел, но не для множеств.

Вот пример того, как использовать эту функцию, и его вывод:

>>> 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 

ВЫВОД:

(0, 0, 3) 
(0, 1, 2) 
(0, 2, 1) 
(1, 1, 3) 
(1, 2, 2) 
(2, 2, 2) 
Смежные вопросы