python - 一线树实现

标签 python dictionary data-structures autovivification

Based of this answer , 我想创建一个 one line tree作为另一个类的一部分,如下所示:

self._tree = collections.defaultdict(lambda: self._tree)

我需要允许所述类的用户将路径元素添加到树中,并从最低的树级别开始运行一些回调。当我运行 pytest 时,我天真的实现会引发错误:

def _add(self, tree, path):
    for node in path:
        tree = tree[node]

def _run(self, tree, callback):
    for key in tree.keys():
        callback(tree[key]) # !!! Recursion detected (same locals & position)
        self._run(key)

如果树定义为

,则此代码有效
    def tree():
        return collections.defaultdict(tree)

    self._tree = tree()

为什么我的天真方法不适用于 lambda 表达式?


Zen of Python指出

Simple is better than complex.

单行 lambda 使代码变得复杂,其中有一个 simpler implementation。 .因此,单行 lambda 不应在生产代码中使用。但是,出于学术兴趣,我将把这个问题留在这里。

最佳答案

第一个链接问题中的单行 defaultdict 设计对我来说不合适。它会产生不寻常的自引用循环:

>>> d = collections.defaultdict(lambda: d)
>>> d["a"] = 23
>>> d["b"]["c"] = 42
>>> print d["b"]["a"] #we never created a value with these keys, so it should just return a defaultdict instance.
23
>>> #uh, that's not right...

第二个链接中函数的单行 lambda 实现看起来更像:

tree = lambda: defaultdict(tree); self._tree = tree()


编辑:看起来你可以在一条语句中完成:

self._tree = (lambda f: f(f))(lambda t: defaultdict(lambda: t(t)))

...但是要求大学水平的 lambda 演算技能只是为了将脚本缩小一个语句似乎是不明智的交易。考虑一种更易于理解的方法。

关于python - 一线树实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35752219/

相关文章:

data-structures - 何时使用前序、后序和中序二叉搜索树遍历策略

java - 如何使用涉及 Java 中的重定向的 header 执行 HTTP 请求

python - 如何检查变量类型? Python

java - 为我的扩展 Pane (键)到框架标题(值)制作 map

Java:根据内部映射对Map进行排序,Map<Long,Map<String, Data>>

android - 一个简单的图像弹出窗口

c# - 计算有两个相同儿子的节点

python - 通过在 Python 3.7 中按段落计算单词来自定义数据结构

python - 如何手动安装本地编译好的python库(共享python库)到系统?

python - 尝试打印值但获取内存位置