2013-10-08 94 views
0

我應該如何定義一個功能parsedic()它的工作原理是什麼?我應該如何解析一個字典對象?

dic={0:0, 
    1:{0:0, 
     1:1, 
     2:{0:0,},}, 
    2:{0:{1:0, 
      0:{0:0}},}, 
    3:0} 

def parsedic(...): 
    ... 

print parsedic(dic) 

導致

0->0 
3->0 
1.0->0 
1.1->1 
1.2.0->0 
2.0.0.0->0 
2.0.1->0 

的類型字典中的關鍵的只能是數字或字符串, 和值只能是數字,字符串,或字典。

(爲了避免誤解,我刪除這表明我是如何試圖解決這個問題,很長一段時間的話。)

+2

至少,我認爲它是。目前尚不清楚你的問題。你究竟在問什麼? –

+0

@kojiro你在哪看到花車? – sloth

+0

@Martijn彼得斯,我看到你提到的問題,但我不認爲我的是你的重複。我問這個問題只是因爲當我試圖解決[這個問題](http:///stackoverflow.com/questions/19221965/python-2-7-how-to-define-a-super-powerful-class-style-dict-object).I問這個問題**而不是**來解決另一個問題。所以,其實,只是好奇心:-) – tcpiper

回答

6

最簡單的方法,以「扁平化」的字典是一個遞歸發生器是這樣的:

def parse(dic): 
    for k, v in dic.items(): 
     if isinstance(v, dict): 
      for p in parse(v): 
       yield [k] + p 
     else: 
      yield [k, v] 

lst = list(parse(dic)) 

這將創建列表[[key,key,key,value],[key,key,val] etc]的列表,爲您的例子將是:

[[0, 0], [1, 0, 0], [1, 1, 1], [1, 2, 0, 0], [2, 0, 0, 0, 0], [2, 0, 1, 0], [3, 0]] 

要在所需的格式打印只是遍歷這個列表:

for row in parse(dic): 
    row = map(str, row) 
    print '.'.join(row[:-1]) + '->' + row[-1] 

這回答了你的問題,但是,如果您首先告訴我們您爲什麼需要這種轉換,那將會很有幫助。也許有更好的方法。

+1

這個答案很酷!我只想知道問題的答案。沒有其他特殊原因。 – tcpiper

4

這種方法可以使當前鍵軌道的路徑上,其ISN值這是一個字典。

def parsedic(d,currHist=[]): 
    for k,v in d.items(): #go over dict's key,value pairs 
     newHist = currHist + [k] #add the current key to the 'path' of keys 
     if isinstance(v,dict): #if that value is a dictionary then we need to go over it's key/vals     
      parsedic(v,currHist=newHist) #recurse... 
     else: #base case 
      print "%s->%d"%('.'.join(map(str,newHist)),v) #print out the path separated by '.' and then -> to the value 

parsedic(dic) 

輸出(注意它不是以相同的順序,因爲遍歷所有鍵,值對會有所不同):

>>> 
0->0 
1.0->0 
1.1->1 
1.2.0->0 
2.0.0.0->0 
2.0.1->0 
3->0 

稍微難讀不創建一個新的方法名單在每一個遞歸是:

currHist.append(k) #add the current key 
    if isinstance(v,dict): 
     parsedic(v,currHist=currHist) 
    else: 
     print "%s->%d"%('.'.join(map(str,currHist)),v) 
    currHist.pop() #remove that same key 
+0

很酷的answer.sovle我的問題完美。 – tcpiper