我有这样的嵌套字典,但要大得多:
d = {'a': {'b': 'c'}, 'd': {'e': {'f':2}}}
我编写了一个函数,它将字典和键路径作为输入,并返回与该路径关联的值。
>>> p = 'd/e'
>>> get_from_path(d, p)
>>> {'f':2}
一旦我获得嵌套字典,我将需要修改它,但是,d不能被修改。我是否需要使用深度复制,或者是否有更高效的解决方案,不需要不断复制字典?
答案 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
可能是合适的。