2016-08-17 108 views
1

我有一個嵌套的字典是這樣,但更大:替代使用嵌套字典的deepcopy?

d = {'a': {'b': 'c'}, 'd': {'e': {'f':2}}} 

我寫了一個函數,它接受一個字典和密鑰作爲輸入的路徑,並返回與該路徑關聯的值。

>>> p = 'd/e' 
>>> get_from_path(d, p) 
>>> {'f':2} 

一旦我得到嵌套字典,我將需要修改它,但是,d不能被修改。我是否需要使用深層複製,還是有更高效的解決方案,不需要不斷製作字典的副本?

+0

您是否反對僅基於效率的深層複製?這是否會導致問題,成爲代碼中性能至關重要的部分? – SethMMorton

+0

一旦你找到嵌套字典,你只需要深拷一次。因此,我不確定「需要不斷複製字典」是什麼意思? – Karin

+0

@SethMMorton一點都沒有。顯然,更高效的解決方案總是更好,但我主要的反對意見是我不想導入複製模塊。 – Bretsky

回答

1

根據你的使用情況,一種方法,以避免更改現有的字典是包裝在一個collections.ChainMap

>>> import collections 

>>> # here's a dictionary we want to avoid dirty'ing 
>>> d = {i: i for in in range(10)} 

>>> # wrap into a chain map and make changes there 
>>> c = collections.ChainMap({}, d) 

現在我們可以來c添加新鍵和值沒有相應的變化發生在d

>>> c[0] = -100 
>>> print(c[0], d[0]) 
-100 0 

無論該解決方案是否合適取決於你的使用情況......特別是ChainMap將:

  • 不是像一個普通的地圖,當談到一些事情,如刪除鍵:

    >>> del c[0] 
    >>> print(c[0]) 
    0 
    
  • 仍然允許你在的地方修改值

    >>> d = dict(a=[]) 
    >>> collections.ChainMap({}, d)["a"].append(1) 
    

    將改變列表d

但是,如果您只是希望拿你的嵌入式字典,並彈出一些新的鍵和值,然後ChainMap可能是合適的。

+0

這是如何擴展到嵌套字典(OP詢問的)? – martineau

+0

這似乎相當於製作淺表字典。如果'd'具有像列表這樣的可變屬性,修改'c'中的列表也會在'd'中修改它。 – Karin

+0

這與c = copy.deepcoy(d)有什麼不同? –