我有以下关系
A | B B | C C | d 我|百灵 Ĵ|乙 ķ| M M |Ñ
我想获得如下的综合关系: A | B | C | D | I | J和K | M | N
我开始使用Python字典的路径,并为每个关系创建键值对,如果键的任何值与任何键匹配,则迭代并向现有键添加新值。但我无法得到很好的解决方案。任何有关想法的帮助都将受到赞赏。
答案 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)