首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我将如何将一个分层列表排序为一个树/吡啶模型的迪克?

我将如何将一个分层列表排序为一个树/吡啶模型的迪克?
EN

Stack Overflow用户
提问于 2014-09-15 19:26:38
回答 2查看 705关注 0票数 2

我正在尝试生成一个dicts层次结构,用于在Qt中创建一个树模型。

数据在一个列表中,每个条目都是--下一个兄弟、前一个兄弟、First_Child、父级,列表中元素的索引是层次结构条目描述的轮廓的名称/索引。

例如,如果我要从4.RETR_TREE 这里部分输入层次结构

代码语言:javascript
复制
hierarchy = 
    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]]])

我想得到这个输出:

代码语言:javascript
复制
{0:{1:{2:{3:{4:{5:{},6:{}}}}}},
7:{},
8:{}}

我希望这样做,以建立一个Qt树模型,以便我可以很容易地看到哪些等高线包含哪些其他。如果您对如何将层次结构数据转换为Qt树模型有更好的了解,也将受到赞赏。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-15 20:36:06

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

代码语言:javascript
复制
import numpy as 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]])

def T(i):
    children = [(h, j) for j, h in enumerate(H) if h[3] == i]
    children.sort(key = lambda h: h[0][1])
    return {c[1]: T(c[1]) for c in children}

print T(-1)

输出:

代码语言:javascript
复制
{0: {1: {2: {3: {4: {5: {}, 6: {}}}}}}, 8: {}, 7: {}}

因此,您可以跳过子级排序,并得到以下紧凑代码:

代码语言:javascript
复制
T = lambda i: {j: T(j) for j, h in enumerate(H) if h[3] == i}
print T(-1)
票数 1
EN

Stack Overflow用户

发布于 2014-09-15 20:32:39

我不熟悉Qt,numpy或opencv,所以我可能在这里遗漏了一些东西,但我还是会尝试一下。

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

代码语言:javascript
复制
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)

测试:

代码语言:javascript
复制
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: {}}

如您所见,此时我只使用最后一个字段(“父”)。特别地,

  1. 我不使用“下一个兄弟”和“先前的兄弟”,因为字典是无序的。
  2. 我没有使用“第一个孩子”,因为这是多余的信息。

这是你想要的吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25855476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档