字典递归按值分组键

时间:2016-11-28 03:03:40

标签: python dictionary

我想根据在简单网络中为节点建模的值对一系列字典键进行分组,看起来像递归函数可以工作,但我没有运气。

这是一个简化的表格:

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我希望能够在不使用图论的情况下解决这个问题。)

1 个答案:

答案 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。代码可能包含错误。如果你找到它们,请指出它们。