假设我想在 Python 中进行类似 PERL 的自动激活,即:
>>> d = Autovivifier()
>>> d = ['nested']['key']['value']=10
>>> d
{'nested': {'key': {'value': 10}}}
有几种主要方法可以做到这一点:
好的 - 简单。
现在假设我想从一个缺少键的字典中返回一个默认值。再一次,很少有方法可以做到这一点:
- 对于非嵌套路径,您可以use a
__missing__
hook - try/except block 包装对可能丢失的 key 路径的访问
- 使用
{}.get(key, default)
(does not easily work with a nested dict)即,没有版本的autoviv.get(['nested']['key']['no key of this value'], default)
这两个目标似乎存在不可调和的冲突(基于我在过去几个小时内试图解决这个问题。)
这里是问题:
假设我想要一个 Autovivifying dict 1) 为 d['arbitrary']['nested']['path']
创建嵌套结构; AND 2) 从不存在的任意嵌套中返回默认值,而不将其包装在 try/except 中?
问题如下:
d['nested']['key']['no key of this value']的调用
is equivalent to(d['nested'])['key']['没有这个值的键']
。如果不返回同样覆盖__getitem__
的对象,覆盖__getitem__
将不起作用。- 如果您测试该路径是否存在,这两种创建 Autovivifier 的方法都会创建一个字典条目。即,我不希望
if d['p1']['sp2']['etc.']
创建整个路径,如果你只是用if
测试它的话>.
我如何在 Python 中提供一个 dict 来:
- 创建类型为
d['p1']['p2'][etc]=val
的访问路径(Autovivication); - 如果您测试是否存在,则不要创建相同的路径;
- 返回一个默认值(如
{}.get(key, default)
)而不用 try/except 包装 - 我不需要整套字典操作。真的只有
d=['nested']['key']['value']=val
和d['nested']['key']['no key of this value ']
等于默认值。我更希望测试d['nested']['key']['no key of this value']
不会创建它,但会接受它。
?
最佳答案
要创建字典的递归树,请使用 defaultdict
和一个技巧:
from collections import defaultdict
tree = lambda: defaultdict(tree)
然后您可以使用 x = tree()
创建您的 x。
以上来自@BrenBarn -- defaultdict of defaultdict, nested
关于python - PERL-like autovivification with default value in Python, and returns a default value from non-existing arbitrary nesting?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24482862/