我正在尝试生成一个dicts层次结构,用于在Qt中创建一个树模型。
数据在一个列表中,每个条目都是--下一个兄弟、前一个兄弟、First_Child、父级,列表中元素的索引是层次结构条目描述的轮廓的名称/索引。
例如,如果我要从4.RETR_TREE 这里部分输入层次结构
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]]])我想得到这个输出:
{0:{1:{2:{3:{4:{5:{},6:{}}}}}},
7:{},
8:{}}我希望这样做,以建立一个Qt树模型,以便我可以很容易地看到哪些等高线包含哪些其他。如果您对如何将层次结构数据转换为Qt树模型有更好的了解,也将受到赞赏。
提前感谢!
发布于 2014-09-15 20:36:06
与@uselpa类似,我正在提出一个解决方案,该解决方案不对具有相同父节点的节点进行排序,因为Python字典没有固定的顺序:
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)输出:
{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)发布于 2014-09-15 20:32:39
我不熟悉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: {}}如您所见,此时我只使用最后一个字段(“父”)。特别地,
这是你想要的吗?
https://stackoverflow.com/questions/25855476
复制相似问题