2016-08-17 104 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)有什么不同? –