Python PriorityQueue实现,属性错误

时间:2017-06-24 02:03:35

标签: python priority-queue

目前正在为我的CS课程进行作业,并且我遇到了我的PriorityQueue实施问题。首先,继承我的 init 为该课程:

class PriorityQueue(Container):

    def __init__(self, less_than):
        """Initialize this to an empty PriorityQueue.

        @type self: PriorityQueue
        @type less_than: Callable[[Object, Object], bool]
            Determines the relative priority of two elements of the queue.
            If x._less_than(y) is true, then x has higher priority than y.
        @rtype: None
        """

        self._queue = []
        self._less_than = less_than

但是,在为我的add方法运行doctests时,我将返回一个属性错误,指出str对象没有属性_less_than。我和我的教授说过,他说“可能只是一个错字”,所以经过几个小时的考虑,我已经转过头了。

下面是添加方法:

def add(self, item):
    if self._queue == []:
        self._queue.append(item)
    for i in range(len(self._queue)):
        if item._less_than(self._queue[i]):
            self._queue.insert(i, item)

然后是错误:

File "/Users/nikitash/Desktop/CSC148/Assignments/Assignment 
1/container.py", line 99, in add
Failed example:
    pq.add('arju')
Exception raised:
    Traceback (most recent call last):
      File "/Applications/PyCharm 
CE.app/Contents/helpers/pycharm/docrunner.py", line 140, in __run
        compileflags, 1), test.globs)
      File "<doctest add[3]>", line 1, in <module>
        pq.add('arju')
      File "/Users/nikitash/Desktop/CSC148/Assignments/Assignment 
 1/container.py", line 113, in add
    if item._less_than(self._queue[i]):
AttributeError: 'str' object has no attribute '_less_than'

非常感谢任何帮助。

感谢。

2 个答案:

答案 0 :(得分:2)

错误信息非常明确:

if item._less_than(self._queue[i]):
    AttributeError: 'str' object has no attribute '_less_than'

这显然告诉我们_less_than上找不到item。显然item属于str类型。由于_less_than是队列的类成员变量,而不是队列的元素,因此需要在队列而不是项目上调用它。另外,根据您发布的文档,_less_than有两个参数,而不是一个。

答案 1 :(得分:1)

你的添加方法应该是这样的:

def add(self, item):
    if not self._queue:  # 1
        self._queue.append(item)
        return
    for i in range(len(self._queue)):
        if self._less_than(self._queue[i], item):   # 2
            self._queue.insert(i, item)
            return
    self._queue.append(item)  # 3

有三件事需要改变。

  1. 在您的代码中,您将self._queue与新的空队列进行比较。相反,你应该利用Python容器对象如果它们为空则具有布尔值False的事实。当您在列表中插入第一个项目时,您已完成并需要返回;否则你会再次插入相同的项目。

  2. _less_than是一个功能。它在构造函数中分配,因此它是PriorityQueue的成员。其目的是比较两个项目。所以你需要用两个要比较的项来调用它:其中一个是列表中的下一个项,另一个是要插入的新项。一旦找到了插入新项目的正确位置,就可以插入它并完成。你必须在那时返回。

  3. 如果_less_than函数为列表中已有的每个项目返回False,则需要在最后添加该项目。