你好伙伴StackOverflowers,

我正在实现一个二进制搜索树,其界面与Python中的dict几乎相同(在任何人问之前,我这样做是为了好玩,没有生产代码)。

为了从我的树中添加,检索和删除元素,我实现了__getitem____setitem____delitem__ ,这非常有效。

问题是,由于这是一个递归数据结构,我的__getitem__方法本身在树的左或右分支上调用__getitem__ ,如果当前节点没有我正在寻找的密钥。

通过__getitem__[]执行此递归调用的最“pythonic”方式是什么?

例:

def __getitem__(self, key):
    if key  == self.key:
        return self.value
    if key < self.key and self.left is not None:
        return self.left[key]
    if key > self.key and self.right is not None:
        return self.right[key]
    return None

def __getitem__(self, key):
    if key  == self.key:
        return self.value
    if key < self.key and self.left is not None:
        return self.left.__getitem__(key)
    if key > self.key and self.right is not None:
        return self.right.__getitem__(key)
    return None

我知道它们的工作完全相同,一个是另一个的包装,但这是一个风格问题。

使用[]直接提供更简洁的代码,更少的冗长,但可能误导那些不能立即理解该指令基本上是方法的递归调用的人,因此__getitem__消除了歧义。

请记住,我不是在谈论在外部调用中使用一个或另一个,在这种情况下应该使用clear [] ,但仅在方法内部,作为递归调用。

你的想法是什么?

#1楼 票数:2

使用[ ]方式。 它的设计就是这样。 如果您唯一的担忧是误导其他代码,那么只需在代码中添加注释即可克服它。

#2楼 票数:2 已采纳

我一般使用[] ,但它确实无关紧要......我不知道这个问题的任何风格指南。


请注意,当您在父类上调用__getitem__时,需要使用__getitem__而不是[...] 例如

class getDict(dict):
   def __getitem__(self,key):
       if key in self:
          return dict.__getitem__(self,key)
       else:
          return None

但那不是你在这里处理的......

请不要使用此代码 - 它不是一个好代码的例子( return dict.get(self,key,None)会更好)。 这只是一个易于阅读的插图

  ask by pcalcao translate from so

未解决问题?本站智能推荐:

2回复

尝试在python上构建递归数据结构

嘿伙计们,我的课程有一个任务,我需要构建一个函数,该函数将给定的树(树)表示为一个元组,返回一棵新树(树的展示) 直到现在我只得到这样的。 树([树([树([树(1), 树(2)]), 树(3)]), 树([树(4), 树([树(5), 树(6)]) ])]) 但我不知道我计算每个内部节点的高度
1回复

在数据结构上进行记忆化递归

我正在尝试对以下问题实施备忘录。 数据结构如下: 这是一个字典,其中的键具有列表值。 在每个键的每个列表中,元素包含与键不同的数字。 示例:如果我们使用键368:[247,257],则会观察到247的键368不包含任何数字。257和368相同,但数字不同。 问题如下:通过使用此数据
2回复

什么是递归检索id值的最佳数据结构?

我想要做的是创建一个mapped id-table ,理论上看起来像下面的嵌套字典。 问题是每个“层”都必须递归合并,这意味着我必须先获得第一层 Id,然后才能检索第二层 Id,然后合并这两层。 合并两层后,我必须从合并的字典中检索第一层和第二层 Id 以获得第三层 Id,然后再次合并,依此类推。
1回复

计算pythondicitonary/array数据结构的非空端叶-递归算法?

我正在寻找一种函数来查找一种复杂字典/数组结构的所有非空端点。 我认为因为我不知道嵌套数组的数量或它们的位置,所以它必须是递归的,而我还没有完全理解这种思路。 所以对于嵌套的字典: 和变量“paths”命名如下,其中“.XX”表示有一个数组(以variety.js的风格): 我想要
1回复

在python中,递归调用函数时,数据结构是否在作用域内

,您好,我有深度优先搜索功能。 我想使用列表,但是列表是否可以进行递归调用? 可以在递归调用中访问已访问节点,以便查看已访问了哪些节点,还是需要将列表作为参数传递? 同样,移动会将机器人移动到下一个节点,您只需在内部添加命令并将其返回给代理即可。 我是否需要在递归堆栈中一直返回一个列
12回复

什么是循环数据结构有用?

我刚刚阅读了Mark Lutz的“学习Python”,并且遇到了这个代码示例 : 它被确定为循环数据结构。 所以我很想知道,这是我的问题: 什么是用于现实生活编程的“循环数据结构”? 似乎有点混乱,我认为这源于非常简短的代码示例...这里有几行使用相同的对象L
1回复

糟糕的树设计,数据结构

我尝试制作一棵树作为我的数据结构课程的一部分。 该代码有效,但速度非常慢,几乎是课程接受时间的两倍。 我没有数据结构和算法方面的经验,但我需要优化程序。 如果有人有任何提示、建议、批评,我将不胜感激。 树不一定是二叉树。 这是代码: 编辑: 对于此输入(第一个数字是节点数,其他数字是节点的值) 我们
1回复

Python:扩展复杂的树数据结构

我正在探索一个数据结构,该数据结构将扩展为子元素并解析为最终元素。 但是我只想存储前两个级别。 例子:假设我从纽约开始,该郡分为布朗克斯,金斯,纽约,皇后区和里士满这两个县,但最终还是以某种方式定居美国。 我不确定这是否是一个很好的例子,但只是在这里明确说明是对该问题的更清楚的解释。