0

一个简短的问题,是否有一个关闭的 self 函数可以从 python 集合的集合中制作图表?更长的问题:我有几个 python 集。它们每个都重叠,或者有些是其他的子集。我想制作一个图(如节点和边)节点是集合中的元素。边是集合的交集,按集合交集中的元素数量加权。python有几个图形包。(NetworkX,igraph,...)我不熟悉其中任何一个的使用。他们中的任何一个是否会直接从集合列表中制作图形,即 MakeGraphfromSets(alistofsets) 如果不是,您是否知道如何获取集合列表来定义边的示例。它实际上看起来可能是直截了当的,但有一个例子总是好的。

4

2 回答 2

2

自己编写代码并不难:

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)]}
于 2010-03-19T06:24:52.447 回答
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)
于 2010-03-19T09:48:32.473 回答