字典递归按值分组键

2024-04-18 23:38:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我想根据一个简单网络中节点之间的模型值对一系列字典键进行分组,似乎递归函数可以工作,但我没有任何运气。你知道吗

下面是一个简化的表格:

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我想不用图论就能解决这个问题。)


Tags: 函数模型id列表字典节点dictlist
1条回答
网友
1楼 · 发布于 2024-04-18 23:38:47

如果我理解正确的话,您需要从字典表示中获取所有断开连接的图。你知道吗

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”]]。最后,代码将列表转换为元组并返回。你知道吗

另外,代码可能包含错误。如果你找到了,请指出。你知道吗

相关问题 更多 >