2010-07-30 26 views
0

我有一個非常大的defaultdict(字典),看起來是這樣的:如何os.walk deep defaultdict值?

data['w']['x']['y']['z']={'a':5,'b':10} 

我想做產生一個報告,列出導航特定最終字典中的所有鍵的層次結構。換句話說,我正在尋找它的「完整路徑名」,就好像最後一個字典是文件,父路徑名是用於查找特定字典的鍵。在這種情況下,該報告將具有以下行:

w:x:y:z:a=5:b=10 

我喜歡用defaultdict,但存在的問題之一是拉材料了深度嵌套defaultdict(字典)的。

任何幫助表示讚賞。

回答

1

如果可能的話,只是扁平化路徑:

data['w:x:y:z'] = {'a':5, 'b':10} 

for path, d in data.items(): 
    print '%s:%s' % (path, ':'.join("%s=%r" % pair for pair in d.items())) 

如果字典的深度在所有情況下恰好有4個,你可以這樣寫:

for w, wvals in data.items(): 
    for x, xvals in wvals.items(): 
     for y, yvals in xvals.items(): 
      for z, zvals in yvals.items(): 
       print '%s:%s:%s:%s:%s' % (
        w, x, y, z, 
        ':'.join("%s=%r" % pair for pair in d.items())) 

否則,您必須求助於遞歸。

def dump(data, path=''): 
    if isinstance(data, defaultdict): 
     for k, v in data.items(): 
      dump(v, path + k + ":") 
    else: 
     print "%s%s" % (path, ':'.join("%s=%r" % pair for pair in d.items())) 

dump(data) 
+0

謝謝。有幾個錯別字,但這讓我開始。特別是,當最終葉子(或者我的比喻中的文件)是一個dict(),並且它上面的所有內容都是defaultdict()時,這種方法非常有效,但是當父樹中可能存在干預詞典時,這種方法就不太好。請注意,這是不能通過檢查上述條件中的詞典實例來解決的。我仍然在努力。 – reckoner 2010-07-30 21:24:00