2015-06-18 111 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