2013-12-14 62 views
2

所以我嵌套的詞典中刪除對象的字典對象如何通過引用從另一個變量

a = {'a':{'b':[1,2,3]}} 

我必須嵌套「B」的引用:

c=a['a']['b'] 

現在,當我調用

del c 
print a 

的結果是

{'a':{'b':[1,2,3]}} 

變量c被刪除,但它引用的對象仍然存在。我想完全刪除嵌套的'b'對象。這是很容易與

del a['a']['b'] 

這樣做,但在這種實際應用中,嵌套太深,這是使用過於頻繁爲實現這一目標是可行的。

問題:如何刪除一個字典標籤只有在另一個變量中引用它?

+0

'del'刪除了指定的引用;您不能刪除*其他*引用,例如爲'a ['a'] ['b']'存儲的引用。您必須存儲一個'路徑',解析除最後一個元素*之外的所有路徑*,然後刪除該引用。 –

+0

如果您知道''c''而不知道''a'''和'''b'',Martijn的解決方案是不適用的。如果你知道''''''''''''b'',它的解決方案對使用''a ['a'] ['b']''有什麼好處?有一些我不明白.... – eyquem

回答

4

del處理提供的參考只有;它不能刪除對其他地方的相同值的引用。這不是Python的工作原理。

商店路徑在嵌套結構:

path = ('a', 'b') 

可以解決這樣的路徑:

def resolve_path(dictionary, path): 
    return reduce(dict.get, path, dictionary) 

,或者你可以得到,之後就可以刪除最後一個元素:

def del_endpoint(dictionary, path): 
    parent_path, last = path[:-1], path[-1] 
    parent = resolve_path(dictionary, parent_path) 
    del parent[last] 

這當然對於嵌套字典非常具體;對於屬性或列表項目,您需要額外的代碼。

+0

非常好,我喜歡減少功能的創造性使用。謝謝! – brthornbury

+0

@Martijn,我喜歡你的答案。 @Mozoby,如果你存儲路徑,請考慮「孤立參考」的情況。如果你保留一個參考文獻*和*路徑作爲Martijn建議,那麼你冒着不一致的風險。例如:如果存儲路徑'('a','b')'並且如果'c = a ['a'] ['b']',然後發生這種情況:'a ['a'] [ 'b'] = [10,20,30]'...現在路徑將指向新列表'[10,20,30]'而'c'仍然是舊列表'[1,2,3 ]'。所以'del_endpoint'可以正常工作,但不會影響孤立引用'c'或其內容。這是我們在Python中可以期待的。 –

相關問題