2015-06-18 89 views
-1
的字典产量

假设我们有这样的字典,我需要通过其分行走,并产生在文件中找到的一切迭代使用字典

a={'files': {'file root':'some root path', 'other file': 'other path'}, 
    'directories':{'directory1':{'files':{'file1':'some path'}, 
           'directories':{'directory2':{'files':{}, 
                  'directories': {}}}}, 
        'folder1':{'files':{}, 
          'directories':{'folder2': {'files': {}, 
                 'directories': {}}, 
              'archive1':{'files': {'empty':None}, 
                 'directories':{}}}}} } 

我的实现看起来像这样

def walk_directory_files(directory): 
    directories = dict.__getitem__(directory, 'directories') 
    files  = dict.__getitem__(directory, 'files') 
    for f in files: 
     yield f 
    for k,d in dict.items(directories): 
     walk_directory_files(d) 

def walk_files(D): 
    return walk_directory_files(D) 

# now lets try it 
list(walk_files(a)) 
>> ['other file', 'file root'] 

我我不知道为什么循环内的walk_directory_files没有被调用!

+0

你想实现什么?请描述更详细的问题。 – dhh

+0

为什么'dict .__ getitem __()'调用而不是仅仅使用'get()',为什么额外的函数'walk_files()'? – Anthon

+0

是的,你是对的,我复制我的代码,因为它是。在我的实现中,由于某种原因,字典a受到保护。所以我必须使用__getitem__。 我知道它是一个愚蠢的保护层,但为了避免直接覆盖密钥 – Cobry

回答

1

你忘了递归屈服。

for k,d in dict.items(directories): 
    for e in walk_directory_files(d): 
     yield e 

注意的Python 3.3 adds additional syntax专门为此:

for k,d in dict.items(directories): 
    yield from walk_directory_files(d) # Python 3.3+ only! 
+0

谢谢,现在它正在工作!不应该在文件循环中的产量足够?在提出这个问题之前,我把print目录放在了walk_directory_files的开头,但是walk_directory_files(d)没有打印任何东西,就好像它根本没有调用函数 – Cobry