我想根据在简单网络中为节点建模的值对一系列字典键进行分组,看起来像递归函数可以工作,但我没有运气。
这是一个简化的表格:
ID fromNode toNode
a 1 2
b 2 3
c 3 4
d 5 6
e 6 7
f 7 8
我从中创建字典:
dict = {'a':(1,2), 'b':(2,3), 'c':(3,4), 'd':(5,6), 'e':(6,7), 'f':(7,8)}
函数结果应该类似于以下列表:
list = (('a','b','c'),('d','e','f'))
因为'a'转到'b'而'b'转到'c'等等。
(PS我希望能够在不使用图论的情况下解决这个问题。)
答案 0 :(得分:0)
如果我理解正确,您希望从字典表示中获取所有断开连接的图形。
def find(dic):
graphes = []
IDs = list(dic)
while IDs:
fromNode = dic[IDs[-1]][0]
graph = []
graphes.append(graph)
findHelper(fromNode, graph, dic, IDs)
# merge the broken lists
connect = []
for i in range(len(graphes)):
for j in range(len(graphes)):
if dic[graphes[i][-1]][-1] == dic[graphes[j][0]][0]:
connect.append((i, j))
if connect:
for pair in connect:
graphes[pair[0]] = graphes[pair[0]] + graphes[pair[1]]
for k in connect:
if k[0] > pair[1]:
k[0] -= 1
if k[1] > pair[1]:
k[1] -= 1
graphes.pop(pair[1])
return tuple((tuple(i) for i in graphes))
def findHelper(fromNode, graph, dic, IDs):
ID = ""
for i in range(len(IDs)):
idf = IDs[i]
if dic[idf][0] == fromNode:
ID = idf
toNode = dic[idf][1]
IDs.pop(i)
break
if ID:
graph.append(ID)
findHelper(toNode, graph, dic, IDs)
上述代码可能有用。
上面的代码,虽然并非所有ID都被登记,但是从dic获取一个id并检查它是否可以找到通往另一个节点的路径:如果是,它们形成一个列表并搜索下一个节点;否则自己形成一个列表。然后,它检查已经形成的列表是否被拆分。例如,对于{" a":(1,2)," b":(2,3)},在这个阶段,代码将产生[[" a"],[" b"]]。代码检测情况并将它们合并到[[" a"," b"]]。最后,代码将列表转换为元组并返回。
P.S。代码可能包含错误。如果你找到它们,请指出它们。