我有一個嵌套的字典是這樣,但更大:替代使用嵌套字典的deepcopy?
d = {'a': {'b': 'c'}, 'd': {'e': {'f':2}}}
我寫了一個函數,它接受一個字典和密鑰作爲輸入的路徑,並返回與該路徑關聯的值。
>>> p = 'd/e'
>>> get_from_path(d, p)
>>> {'f':2}
一旦我得到嵌套字典,我將需要修改它,但是,d不能被修改。我是否需要使用深層複製,還是有更高效的解決方案,不需要不斷製作字典的副本?
我有一個嵌套的字典是這樣,但更大:替代使用嵌套字典的deepcopy?
d = {'a': {'b': 'c'}, 'd': {'e': {'f':2}}}
我寫了一個函數,它接受一個字典和密鑰作爲輸入的路徑,並返回與該路徑關聯的值。
>>> p = 'd/e'
>>> get_from_path(d, p)
>>> {'f':2}
一旦我得到嵌套字典,我將需要修改它,但是,d不能被修改。我是否需要使用深層複製,還是有更高效的解決方案,不需要不斷製作字典的副本?
根據你的使用情況,一種方法,以避免更改現有的字典是包裝在一個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
可能是合適的。
您是否反對僅基於效率的深層複製?這是否會導致問題,成爲代碼中性能至關重要的部分? – SethMMorton
一旦你找到嵌套字典,你只需要深拷一次。因此,我不確定「需要不斷複製字典」是什麼意思? – Karin
@SethMMorton一點都沒有。顯然,更高效的解決方案總是更好,但我主要的反對意見是我不想導入複製模塊。 – Bretsky