【问题标题】:Iterate through unexpected layers of a nested dictionary遍历嵌套字典的意外层
【发布时间】:2014-10-28 13:15:18
【问题描述】:

所以我的情况如下。我有一本字典(如下所示),我想通过可能的大量迭代对其进行迭代,而不必手动定义“for i in dictionary[x][y][...]”。我打算遍历每一层并为其他目的创建一大串 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>

我该怎么做呢?

【问题讨论】:

  • 检查类型并递归执行
  • 可悲的是,我不完全确定我会如何做到这一点@marcadian。您知道我可以对其进行进一步研究的任何链接/来源吗?
  • 您的示例是关于文件系统的,如果您实际上是在这些文件所在的系统上运行此代码,您应该能够使用 os.listdir( ) 和 os.path.isdir()
  • 您的示例 HTML 似乎是错误的(&lt;i&gt; 没有内容的标签,&lt;ul&gt; 未封闭的标签,在某些情况下也应该是 &lt;li&gt;)和 更重要的是 它与嵌套的dict 结构没有任何明显的对应关系:例如,HTML 版本中的'Another File' 发生了什么?您应该更正所需的输出,因为它与输入不一致。

标签: python dictionary iteration


【解决方案1】:

我很难说出您实际尝试对输出做什么,但是使用递归来展平嵌套字典是一种很好的可能性:

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')]

注意这里发生了什么:嵌套的dicts 已转换为tuples 的平面列表。然后,您可以遍历此列表并查找 START-FOLDER/END-FOLDER 标记来决定何时输出打开和关闭 &lt;ul&gt; 标记。

【讨论】:

    【解决方案2】:

    由于您正在查看文件系统,如果您在文件系统所在的系统上运行此代码,您可以使用 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
    

    【讨论】:

      猜你喜欢
      • 2017-07-25
      • 2013-07-21
      • 1970-01-01
      相关资源
      最近更新 更多