2013-12-21 64 views
0

我對Python中的字典有疑問。Python:遞歸地更改字典

我有這樣一本字典:

D = {'key1' : ['key3'], 'key2' : {}, 'key3' : ['key2']} 

而我的目標是,所有的值都儘可能地取代這樣的:

After first iteration: 
D = {'key1' : {'key3' : ['key2']}, 'key2' : {}, 'key3' : {'key2' : {}]} 

After second iteration: 
D = {'key1' : {'key3' : {'key2' : {}}}, 'key2' : {}, 'key3' : ['key2']} 

是否有可能做到這一點?

我想是這樣的:

for k in D.keys(): 
    try: 
     if D[k] in D.keys: 
      D[k] = D[D[k]] 
    except: 
     pass 

我知道這不是正確的,它不工作。我想也許我應該使用遞歸函數。 你能告訴我如何正確更新字典中的值?

對不起,如果我的解釋不清楚,但我希望你明白了。

謝謝!

+1

爲什麼值在列表中? –

+0

這些值與上面所述的相同。我的意思是,'key1'的值是一個包含一個元素'key3'的列表,'key3'實際上是一個帶有'key2'列表的字典鍵等。我想替換這些。所以,'key1'的值應該變成[['key2]],並且變成[[{}]]。最後,我想只有嵌套字典(沒有列表)。我知道我的解釋很混亂,但我只是在想,如果字典的值與鍵匹配或不匹配,是否可以用字典的值替換。 – WonderMan

+0

最終字典應該包含嵌套字典,最好是值。 – WonderMan

回答

1

你需要確保你更換淺的部分,即那些在d關鍵值已經是一個dict,第一:

def fix_dict(d): 
    fixed = False 
    while not fixed: 
     fixed = True 
     for k, v in d.items(): 
      if isinstance(v, list) and isinstance(d[v[0]], dict): 
       fixed = False 
       d[k] = {v[0]: d[v[0]]} 

注意,這是遞歸,但將循環,直到它執行一個沒有任何變化的通過,並且不限於兩層嵌套。

0

這會給你的解決方案,但我不是一個Python程序員,所以有可能是一個更好的方式來做到這一點:

D = {'key1' : ['key3'], 'key2' : {}, 'key3' : ['key2']} 

def sub(D, d): 
    if isinstance(d, list) and d[0] in D: 
    d = {d[0] : sub(D, D[d[0]])} 
    return d 

for k in D.keys(): 
    D[k] = sub(D, D[k]) 

print D 

輸出:

{'key3': {'key2': {}}, 'key2': {}, 'key1': {'key3': {'key2': {}}}} 
+0

'E = D'將兩個變量名稱綁定到同一個對象。如果你想改變一個而不影響另一個,你需要'deepcopy'(因爲這些值本身是可變的)。 – jonrsharpe

+0

好的。無論如何,我認爲E是不必要的 – mgamba