将嵌套字典转换为lis

2024-04-26 13:29:56 发布

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

我知道这里有很多问题要列出,但我找不到我所需要的信息,所以我要问一个新的问题。

一些背景知识:我为我的模型使用了一个层次化的包,生成树结构的内置函数输出一个嵌套的循环来指示父对象、子对象等。我的目标是保持视图中的逻辑并输出一个列表,这样我就可以在模板中简单地循环它。

这是我的数据,在树结构中:

1
-1.1
--1.1.1
---1.1.1.1
--1.1.2
-1.2
--1.2.1
--1.2.2
-1.3

这是我得到的嵌套字典

{
 <Part: 1.1>:
 {
   <Part: 1.1.1>:
     {
       <Part: 1.1.1.1>: {}
     }, 
   <Part: 1.1.2>: {}
 },
 <Part: 1.2>: 
 {
   <Part: 1.2.1>: {},
   <Part: 1.2.2>: {}
 }, 
 <Part: 1.3>: {}
}

或者,如果你不喜欢我试图打破它的方式,这里是我在一行中得到的:

{<Part: 1.1>: {<Part: 1.1.1>: {<Part: 1.1.1.1>: {}}, <Part: 1.1.2>: {}}, <Part: 1.2>: {<Part: 1.2.1>: {}, <Part: 1.2.2>: {}}, <Part: 1.3>: {}}

我想得到的是:

[<Part: 1.1>, <Part: 1.1.1>, <Part: 1.1.1.1>, <Part: 1.1.2>, <Part: 1.2>, <Part: 1.2.2>, <Part: 1.2.1>, <Part: 1.3>,]

我试过迭代dict.items中的键,但只得到顶级键(1.1、1.2、1.3)

我需要做什么才能更深入?

谢谢!


Tags: 数据对象函数模型视图模板信息目标
3条回答

我认为递归可以是你的朋友:

top = {"<Part: 1.1>": {"<Part: 1.1.1>": {"<Part: 1.1.1.1>": {}}, "<Part: 1.1.2>": {}}, "<Part: 1.2>": {"<Part: 1.2.1>": {}, "<Part: 1.2.2>": {}}, "<Part: 1.3>": {}}

 def grab_children(father):
    local_list = []
    for key, value in father.iteritems():
        local_list.append(key)
        local_list.extend(grab_children(value))
    return local_list

print grab_children(top)

开始。。。呃,我是说,递归。试试这个:

def recurse(dict):
    result = []
    for key in dict:
        result.append(key)
        result.extend(recurse(dict[key]))
    return result

前面的所有解决方案都递归地构建了大量列表,然后将它们扩展回越来越大的列表,直到得到最终答案。虽然它可以工作,但从性能的角度来看,它并不是最优的,因为它创建了许多您真正不需要的列表,并且涉及到将相同的项多次扩展到其父列表中。有些解决方案还忘了按键排序。

top = {"<Part: 1.1>": {"<Part: 1.1.1>": {"<Part: 1.1.1.1>": {}}, "<Part: 1.1.2>": {}}, "<Part: 1.2>": {"<Part: 1.2.1>": {}, "<Part: 1.2.2>": {}}, "<Part: 1.3>": {}}

def flatten(d, ret=None):
    if ret is None:
        ret = []
    for k, v in sorted(d.items()):
        ret.append(k)
        if v:
            flatten(v, ret)
    return ret

def test():
    flatten(top)

根据python -m timeit -s "import flatten" "flatten.test()",该方法在更新以正确排序输出时,每个循环使用8.57个usecs,而对于Cédrics应答,每个循环使用14.4个usecs(for key, value in sorted(father.items()):

相关问题 更多 >