我幾乎可以肯定有一個簡單的解決方案,但我已經花了幾個小時讀取和重讀相同的一組相關結果我很難回答我的問題。漫步/遍歷任意深度的嵌套字典(字典表示一個目錄樹)
這個問題的背景下(包括完成,但隨意跳過此)
在此之前,因爲我希望用戶能夠在一個目錄內選擇一組文件(以及任何子目錄),不幸的是,在Windows 7(http://bugs.python.org/issue8010)中,Tkinter在文件對話框中選擇多個文件的默認功能被破壞。因此,我試圖通過替代方法(仍然使用Tkinter)來表示目錄結構:構造目錄結構的傳真,由標記和縮進複選框(以樹組織)組成。因此,像這樣的目錄:
\SomeRootDirectory
\foo.txt
\bar.txt
\Stories
\Horror
\rickscott.txt
\Trash
\notscary.txt
\Cyberpunk
\Poems
\doyoureadme.txt
會是這個樣子(其中#代表checkbutton):
SomeRootDirectory
# foo.txt
# bar.txt
Stories
Horror
# rickscott.txt
Trash
# notscary.txt
Cyberpunk
Poems
# doyoureadme.txt
建立從目錄結構中的原始字典很容易使用特定的食譜,我發現在ActiveState(見下文),但是當我嘗試迭代我留下的很好的嵌套字典時,我碰到了一堵牆。我想我需要遍歷它,以便用一個漂亮的樹形網格表示來填充一個Tkinter框架。然後我希望通過解釋哪些複選框是真的還是假的,來加載用戶選擇的各種文本文件。除了遍歷字典而沒有修復深度的以外,一切似乎都相當簡單。
更抽象的術語
爲了讓我使用的是ActiveState的配方,這些嵌套的字典 - http://code.activestate.com/recipes/577879/。它實現os.walk來製作這樣的字典:
a={
'SomeRootDirectory': {
'foo.txt': None,
'bar.txt': None,
'Stories': {
'Horror': {
'rickscott.txt' : None,
'Trash' : {
'notscary.txt' : None,
},
},
'Cyberpunk' : None
},
'Poems' : {
'doyoureadme.txt' : None
}
}
}
在這之後我就難住了。我是一個Python新手,僅僅是一個人文科學專業......在我看來,這意味着遞歸對我來說非常混亂。所以我查看了食譜,並嘗試了各種類似的答案,但無濟於事。我需要能夠迭代這個字典,以便填充它的另一個表示形式,並且在這樣做之後(即在用戶選擇了哪些文件之後)重建對這些文件的引用。
我很抱歉,如果這太冗長!感謝您的幫助!
解決方案改編自spicavigo的響應
#distinguish between directory and file
dirtab = "/==="
filetab = "|---"
Parents={-1:"Root"}
def add_dir(level, parent, index, k):
print (dirtab*level)+k
def add_file(level, parent, index, k):
#Currently an empty folder gets passed to add_file; here's a quick treatment.
if "." in k:
print (filetab*level)+k
else:
print (dirtab*level)+k
def addemup(level=0, parent=-1, index=0, di={}):
for k in di:
index +=1
if di[k]:
Parents[index]=k
add_dir(level, parent, index, k)
addemup(level+1, index, index, di[k])
else:
add_file(level, parent, index, k)
addemup(di=a) #dictionary from above
這會產生,我認爲會很容易修改成Tkinter的代表性的東西:
SomeRootDirectory
/===Poems
|---|---doyoureadme.txt
/===Stories
/===/===Horror
|---|---|---rickscott.txt
/===/===/===Trash
|---|---|---|---notscary.txt
/===/===Cyberpunk
|---foo.txt
|---bar.txt
謝謝,這個社會是不可思議的。
當你遍歷字典鍵值對(這需要字典作爲自變量的函數內),您可以檢查是否值是一個字典類型,如果是,則調用函數再次即在這裏使用遞歸,並將該值作爲字典傳遞給函數,否則處理值..這應該解決變量深度迭代問題 – avasal