多个链接 - Python

时间:2016-02-09 02:43:01

标签: python dictionary

我有以下关系

A | B B | C C | d 我|百灵 Ĵ|乙 ķ| M M |Ñ

我想获得如下的综合关系: A | B | C | D | I | J和K | M | N

我开始使用Python字典的路径,并为每个关系创建键值对,如果键的任何值与任何键匹配,则迭代并向现有键添加新值。但我无法得到很好的解决方案。任何有关想法的帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:2)

您正在寻找无向图的连通分量。不要重新发明轮子;使用networkx

import networkx as nx
G = nx.Graph()
G.add_edge("A","B")
G.add_edge("B","C")
G.add_edge("B","D")
G.add_edge("I","J")
G.add_edge("J","B")
G.add_edge("K","M")
G.add_edge("M","N")
print(nx.connected_components(G))

答案 1 :(得分:0)

你们关系的对称性(反身性)是集合的好例子。您可以使用update()扩展集合。注意对象链接问题 - 您希望确保集更新,而不是替换。

Relations = """A|B B|C B|D I|J J|B K|M M|N"""

def parse_relations(relstr):
    rels = {}
    for pair in relstr.split():
        a,b = pair[0:3:2]
        print(a,b)

        if a in rels:
            rels[a].update((b))
        else:
            rels[a] = set((a,b))

        if b in rels:
            if b is a:
                pass
            else:
                rels[a].update(rels[b])
                rels[b].update(rels[a])
        else:
            rels[b] = rels[a]

    return rels

def group_relations(reldict):
    distinct = set()

    for relset in reldict.values():
        relstr = '|'.join(sorted(relset))
        distinct.add(relstr)

    return sorted(distinct)


if __name__ == "__main__":
    d = parse_relations(Relations)
    g = group_relations(d)
    print(g)