查找未分类数据的路径

时间:2017-09-04 12:36:37

标签: python algorithm graph-algorithm

我有这些数据:

data = [
    {"start": "MIA", "end": "FCA"},
    {"start": "FCA", "end": "GVK"},
    {"start": "GVK", "end": "LSD"}
]

有了这些数据,我需要找到一条路径。在上述情况下,路径将从MIAFCA,然后是FCAGVK,最后是GVKLSD。路径永远不会有分支,它永远不会回到它已经通过的点,没有循环。作为输出,我只需要获取"end"数组的每个元素的data点:["FCA", "GVK", "LSD"]

所以,这就是我尝试过的:

def find_path(connections, counter, data):
    if connections[-1] == data[counter]["start"]:
        connections.append(data[counter]["end"])
        if len(connections) == len(data):
            return connections
    return find_path(connections, counter+1, data)

它的作用只是因为data已排序。但是当我像这样更改data时:

data = [
    {"start": "FCA", "end": "GVK"},
    {"start": "MIA", "end": "FCA"},
    {"start": "GVK", "end": "LSD"}
]

失败了。

问题:实现这一目标的方法是什么?

我考虑在函数到达数据末尾时重置函数顶部的countercounter = 0 if counter == len(data) else counter,但是有了这个,我必须在connections索引处折扣在此处:if connections[-1] == data[counter]["start"]:并在此处将data元素添加到其他位置:connections.append(data[counter]["end"])。我觉得它有点乱。

1 个答案:

答案 0 :(得分:1)

以下递归函数将完成这项工作:

data = [
    {"start": "FCA", "end": "GVK"},
    {"start": "MIA", "end": "FCA"},
    {"start": "GVK", "end": "LSD"}
]

def find_path(data, start='', result=[]):
    l = data.copy()
    for d in data:
        if d['start'] == start:
            result.append(d['end'])
            l.remove(d)
            find_path(l, result[-1], result)
    return result

print(find_path(data, 'MIA'))

输出:

['FCA', 'GVK', 'LSD']