所以我的情况如下。我有一个字典(如下所示),我想要迭代大量的迭代,而不必在字典[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> A_Folder
</ul>
<br>
<ul>
<i class="fi-folder"></i> Another_Folder
<ul>
<ul>
<i class="fi-folder"></i> Folder_Stacked
<ul>
<ul><i class="fi-page"></i> Stacked_File
<ul><i class="fi-page"></i> Another_Stacked_File
</ul>
</ul>
</ul>
</ul>
我将如何做到这一点?
答案 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>
标记。