对嵌套字典使用deepcopy的替代方法?

时间:2016-08-17 02:30:28

标签: python dictionary

我有这样的嵌套字典,但要大得多:

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

我编写了一个函数,它将字典和键路径作为输入,并返回与该路径关联的值。

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

一旦我获得嵌套字典,我将需要修改它,但是,d不能被修改。我是否需要使用深度复制,或者是否有更高效的解决方案,不需要不断复制字典?

1 个答案:

答案 0 :(得分: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可能是合适的。