Python 我如何将层次列表排序到dicts的树/嘧啶模型中?

Python 我如何将层次列表排序到dicts的树/嘧啶模型中?,python,qt,opencv,recursion,hierarchy,Python,Qt,Opencv,Recursion,Hierarchy,我试图生成一个dict层次结构,用于在Qt中创建树模型 数据在一个列表中,每个条目都是[下一个同级、上一个同级、第一个子级、父级],列表中元素的索引是层次条目描述的轮廓的名称/索引 例如,如果我要从4.RETR_树输入层次结构 我希望获得以下输出: {0:{1:{2:{3:{4:{5:{},6:{}}}}}}, 7:{}, 8:{}} 我希望这样做是为了在Qt中构建一个树模型,这样我就可以很容易地看到哪些轮廓包含哪些其他轮廓。如果您对如何将层次结构数据转换为Qt树模型有更好的了解,我们将不胜感

我试图生成一个dict层次结构,用于在Qt中创建树模型

数据在一个列表中,每个条目都是[下一个同级、上一个同级、第一个子级、父级],列表中元素的索引是层次条目描述的轮廓的名称/索引

例如,如果我要从4.RETR_树输入层次结构

我希望获得以下输出:

{0:{1:{2:{3:{4:{5:{},6:{}}}}}},
7:{},
8:{}}
我希望这样做是为了在Qt中构建一个树模型,这样我就可以很容易地看到哪些轮廓包含哪些其他轮廓。如果您对如何将层次结构数据转换为Qt树模型有更好的了解,我们将不胜感激


提前谢谢

我不熟悉Qt、numpy或opencv,所以我可能在这里遗漏了一些东西,但无论如何我都会尝试一下

以下算法根据请求创建字典:

def make_hdict(hier):
    def recur(parent):
        res = {}
        for i,n in enumerate(hier):
            if n[3] == parent:
                res[i] = recur(i)
        return res
    return recur(-1)
测试:

hierarchy = [[ 7, -1,  1, -1], #0
             [-1, -1,  2,  0], #1
             [-1, -1,  3,  1], #2
             [-1, -1,  4,  2], #3
             [-1, -1,  5,  3], #4
             [ 6, -1, -1,  4], #5
             [-1,  5, -1,  4], #6
             [ 8,  0, -1, -1], #7
             [-1,  7, -1, -1]] #8    
print(make_hdict(hierarchy))
=> {0: {1: {2: {3: {4: {5: {}, 6: {}}}}}}, 8: {}, 7: {}}
正如您所看到的,我现在只使用最后一个字段(“父项”)。 特别是,

  • 我没有使用“下一个兄弟姐妹”和“上一个兄弟姐妹”,因为字典是无序的
  • 我没有使用“第一个孩子”,因为它是多余的信息

  • 这就是您想要的吗?

    与@uselpa类似,我提出了一个解决方案,它不会对具有相同父节点的节点进行排序,因为Python字典没有固定的顺序:

    将numpy导入为np
    H=np.array(
    [[ 7, -1,  1, -1],
    [-1, -1,  2,  0],
    [-1, -1,  3,  1],
    [-1, -1,  4,  2],
    [-1, -1,  5,  3],
    [ 6, -1, -1,  4],
    [-1,  5, -1,  4],
    [ 8,  0, -1, -1],
    [-1,  7, -1, -1]])
    定义T(i):
    如果h[3]==i,则枚举(h)中j,h的children=[(h,j)
    sort(key=lambda h:h[0][1])
    返回{c[1]:T(c[1]),用于子对象中的c}
    打印T(-1)
    
    输出:

    {0: {1: {2: {3: {4: {5: {}, 6: {}}}}}}, 8: {}, 7: {}}
    
    因此,您可以跳过对子项的排序,最终得到以下紧凑代码:

    T = lambda i: {j: T(j) for j, h in enumerate(H) if h[3] == i}
    print T(-1)
    

    哇!我发现这是一个简单的列表,不需要numpy。这里有一个版本适用于我们这些没有dict理解的人:
    T=lambda i:dict((j,T(j))表示枚举(h)中的j,h,如果h[3]=i);打印T(-1)
    T = lambda i: {j: T(j) for j, h in enumerate(H) if h[3] == i}
    print T(-1)