我有一个嵌套的字典是这样,但更大:替代使用嵌套字典的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