Pergunta

A pergunta curta, existe uma função fora da função para fazer um gráfico de uma coleção de conjuntos de python? A pergunta mais longa: eu tenho vários conjuntos de Python. Cada um deles se sobrepõe ou alguns são sub -conjuntos de outros. Eu gostaria de fazer um gráfico (como nos nós e bordas) nós são os elementos nos conjuntos. As bordas são a interseção dos conjuntos com o número de elementos na interseção dos conjuntos. Existem vários pacotes gráficos para Python. (Networkx, iGraph, ...) Não estou familiarizado com o uso de nenhum deles. Qualquer um deles criará um gráfico diretamente a partir de uma lista de conjuntos, isto é, makegraphfromsets (alistOfSets), se não, você sabe de um exemplo de como obter a lista de conjuntos para definir as bordas. Na verdade, parece que pode ser direto, mas é sempre bom ter um exemplo.

Foi útil?

Solução

Não é muito difícil codificar a si mesmo:

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

Esta função números cada um conjunto com seu índice dentro sets. Fazemos isso porque as teclas do dict devem ser imutáveis, o que é verdadeiro para números inteiros, mas não conjuntos.

Aqui está um exemplo de como usar essa função e é a saída:

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

Outras dicas

 

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

RESULTADO:

(0, 0, 3)
(0, 1, 2)
(0, 2, 1)
(1, 1, 3)
(1, 2, 2)
(2, 2, 2)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top