目前正在为我的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'
非常感谢任何帮助。
感谢。
答案 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
有三件事需要改变。
在您的代码中,您将self._queue
与新的空队列进行比较。相反,你应该利用Python容器对象如果它们为空则具有布尔值False
的事实。当您在列表中插入第一个项目时,您已完成并需要返回;否则你会再次插入相同的项目。
_less_than
是一个功能。它在构造函数中分配,因此它是PriorityQueue
的成员。其目的是比较两个项目。所以你需要用两个要比较的项来调用它:其中一个是列表中的下一个项,另一个是要插入的新项。一旦找到了插入新项目的正确位置,就可以插入它并完成。你必须在那时返回。
如果_less_than
函数为列表中已有的每个项目返回False
,则需要在最后添加该项目。