迭代嵌套字典的意外层

时间:2014-09-03 22:13:01

标签: python dictionary iteration

所以我的情况如下。我有一个字典(如下所示),我想要迭代大量的迭代,而不必在字典[x] [y] [...]'中手动定义i。我打算遍历每一层并为其他目的创建一个大的html字符串。对于我的字典,可能存在未知数量的子文件夹和文件,这使得它很难迭代。

这是我的词典

{'A Folder': {
    'Another Folder': {
         'Stacked_File': 'secretid'
         'Another Stacked_File': 'anothersecretid'
    }

}, 'Another File':'moreids'...
}

我希望转换为...

<ul>
    <ul>
        <i class="fi-folder"></i>&nbsp;&nbsp;A_Folder
    </ul>

    <br>

    <ul>
        <i class="fi-folder"></i>&nbsp;&nbsp;Another_Folder
        <ul>
            <ul>
                <i class="fi-folder"></i>&nbsp;&nbsp;Folder_Stacked
                <ul>
                    <ul><i class="fi-page"></i>&nbsp;&nbsp;Stacked_File
                    <ul><i class="fi-page"></i>&nbsp;&nbsp;Another_Stacked_File
                </ul>
            </ul>
        </ul>
    </ul>

我将如何做到这一点?

2 个答案:

答案 0 :(得分:0)

由于您正在查看文件系统,如果您在文件系统所在的系统上运行此代码,则可以使用os.listdir()和os.path.isdir()通过递归来处理它。这是一个基本的例子:

def iter_folder(folder):
    if not os.path.isdir(folder):
        return
    print "folder: " + folder
    for item in os.listdir(folder):
        if os.path.isdir(item):
            iter_folder(item)
        else:
            print "file: " + item

答案 1 :(得分:0)

我很难用输出告诉你实际上想要的内容,但使用递归来展平嵌套字典是一个很好的可能性:

d = {'A Folder': {
    'Another Folder': {
         'Stacked_File': 'secretid',
         'Another Stacked_File': 'anothersecretid'
    }

}, 'Another File':'moreids'
}

def nested_dict_flattener(d, level=0):
    l = []
    for k,v in d.items():
        if isinstance(v, basestring):
            l.append((level, k, v))
        elif isinstance(v, dict):
            l.append((level, k, 'START-FOLDER'))
            l.extend(nested_dict_flattener(v, level+1))
            l.append((level, k, 'END-FOLDER'))
    return l

import pprint
pprint.pprint( nested_dict_flattener(d) )

输出:

[(0, 'A Folder', 'START-FOLDER'),
 (1, 'Another Folder', 'START-FOLDER'),
 (2, 'Stacked_File', 'secretid'),
 (2, 'Another Stacked_File', 'anothersecretid'),
 (1, 'Another Folder', 'END-FOLDER'),
 (0, 'A Folder', 'END-FOLDER'),
 (0, 'Another File', 'moreids')]

请注意这里发生了什么:您的嵌套dict已转换为tuple的平面列表。然后,您可以遍历此列表并查找START-FOLDER / END-FOLDER标记,以决定何时输出开始和结束<ul>标记。

相关问题