python - PERL-like autovivification with default value in Python, and returns a default value from non-existing arbitrary nesting?

标签 python dictionary recursion defaultdict autovivification

假设我想在 Python 中进行类似 PERL 的自动激活,即:

>>> d = Autovivifier()
>>> d = ['nested']['key']['value']=10
>>> d
{'nested': {'key': {'value': 10}}}

有几种主要方法可以做到这一点:

  1. Use a recursive default dict
  2. Use a __missing__ hook to return the nested structure

好的 - 简单。

现在假设我想从一个缺少键的字典中返回一个默认值。再一次,很少有方法可以做到这一点:

  1. 对于非嵌套路径,您可以use a __missing__ hook
  2. try/except block 包装对可能丢失的 key 路径的访问
  3. 使用 {}.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 中?

问题如下:

  1. d['nested']['key']['no key of this value']的调用 is equivalent to (d['nested'])['key']['没有这个值的键']。如果不返回同样覆盖 __getitem__ 的对象,覆盖 __getitem__ 将不起作用。
  2. 如果您测试该路径是否存在,这两种创建 Autovivifier 的方法都会创建一个字典条目。即,我不希望 if d['p1']['sp2']['etc.'] 创建整个路径,如果你只是用 if 测试它的话>.

我如何在 Python 中提供一个 dict 来:

  1. 创建类型为 d['p1']['p2'][etc]=val 的访问路径(Autovivication);
  2. 如果您测试是否存在,则不要创建相同的路径;
  3. 返回一个默认值(如 {}.get(key, default))而不用 try/except 包装
  4. 我不需要整套字典操作。真的只有 d=['nested']['key']['value']=vald['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/

相关文章:

python - 升级到 tensorflow v1.0 后使用 tensorflow.mul() 的代码失败

python - python中线程数的最大限制

.net - 在 .NET 中实现 Trie 的明智方法是什么?

java - 如何从 Java 8 中的管道分离 CSV 返回 map

python - 字典键不是串行的

javascript - 我如何超越递归限制?

recursion - Lisp 中的递归函数如何工作?

python - Django/Python 中的语音调用

python - Django 表单字段验证失败

python - 递归搜索