【问题标题】:circular array class in pythonpython中的循环数组类
【发布时间】:2011-09-16 21:58:12
【问题描述】:

我有一个创建循环数组类的项目,我将使用的语言是 python。我是 python 类的新手,但是在阅读了一些网页和书籍章节后,我想我对它们的工作原理有所了解。但是我需要帮助,所以我想我会来 SO 的优秀老师 :)

我们的类必须能够实现几个操作;在前面插入,在后面插入,在索引处插入,从前面删除,从后面删除,从索引中删除。

我已经开始编码,但遇到了一些问题,我不能 100% 确定我的语法是否正确。

这是我目前所拥有的:

class circular:

    def __init__(self):
        self.store = []
        self.capacity = len(self.store)
        self.size = 0
        self.startIndex = 0
        self.endIndex = 0

    def decrementIndex(self):
        index = index - 1
        if index < 0:
            self.store = self.store + self.capacity

    def incrementIndex(self):
        index = index + 1
        if index == self.capacity:
            index = index - self.capacity

    def addToBack(self, value):
        self.store[self.endIndex] = value
        self.endIndex = incrementIndex(self.endIndex)
        self.size += 1

    def addToFront(self, value):
        if self.size == 0:
            addToBack(self, value)
        else:
            self.startIndex = decrementIndex(self.startIndex)
            self.store[self.startIndex] = value
            self.size += 1

我在那里停下来开始测试一些功能,主要是 addTofront 和 addToback。在使用 c = circular() 和 c.addToBack(2) 在 IDLE 中测试它们时,我得到一个索引错误......我不知道为什么。这不是唯一的问题,这只是我陷入困境并需要帮助前进的地方。

我在这里发帖是因为我需要帮助并想学习,而不是因为我很懒并且没有尝试研究我的问题。已经谢谢了!

【问题讨论】:

  • a=[]; a[1]=3 会产生同样的错误。您不能写入不存在的索引。你想做什么,这是一个圆形(固定大小)缓冲区吗?
  • @yi_H 是的,这是一个编写执行上述操作的固定循环缓冲区的项目。我已经修复了索引问题,现在我调用的每个函数都没有定义错误,所以我猜我的语法有问题。
  • 小提示:当你在索引中加或减一个时,你不必验证索引是否(分别)等于容量或

标签: python class circular-buffer


【解决方案1】:

__init__你设置

self.store = []

addToBack 你可以

self.store[self.endIndex] = value

如果这是对循环数组的第一个操作,并且您将2 作为value 传递,那么这就变成了

[][0] = 2

问题应该很明显——一个空列表没有0的索引,它根本没有索引。

您需要以不同的方式将项目添加到列表中。

我不会确切地告诉你如何解决这个问题,因为这是你家庭作业的一部分。

【讨论】:

  • 是的,我知道问题出在哪里。我根据解释循环数组的阅读材料编写了所有这些代码,并且我们的老师对每个函数的工作方式进行了伪编码。我应该追加吗?还是设置 self.store = [None] 会更好,还是一样?同样在测试 c.addToFront(2) 时,我收到一条错误消息,提示未定义 addToBack ... 为什么会这样?感谢您的回复。
  • @roboman - 对于您的第一个问题:如果您设置 self.store = [None],那么当索引为 1 而不是 0 时,您就会遇到问题。您需要扩大列表 - append听起来是addToBack 这样做的好方法。对于addToFront,它正在寻找addToBack 作为局部变量、封闭变量、全局变量或内置变量——它们都不是,它是一个实例方法,所以你需要在实例上引用它,就像@987654334 @、startindex
  • 好的。增加列表的唯一问题是它必须是一个固定大小的缓冲区,一个具有固定容量的缓冲区。我觉得增加这个列表会让它变得动态,这是我在这个之后的下一个项目。我说的对吗?
  • 您的代码不会将其显示为固定大小的缓冲区——您永远不会将大小设置为零以外的任何值。你的意思是在构造函数中取一个大小吗?如果您确实知道__init__ 中的实际大小,您当然可以以类似于self.store = [None] * size 的方式初始化list。您不再问与您的问题相同的问题,因此如果您需要更多帮助,请接受答案并提出一个新的、明确的、具体的问题,不要继续在 cmets 中扩展您的问题。跨度>
猜你喜欢
  • 2012-01-21
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 2015-09-03
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多