Вопрос

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

Это было полезно?

Решение

Закодировать самому не так уж сложно:

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.Мы делаем это потому, что ключи dict должны быть неизменяемыми, что верно для целых чисел, но не для множеств.

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

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

Другие советы

 

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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top