我有一个关于我的代码的问题,在这个问题中我需要使用'init‘函数吗?我试着用它,但我不知道我哪里出错了。
这是比利时根特大学的任务
“使用一种受耐心纸牌游戏启发的技术,可以将项目序列按递增顺序排序。排序分两个阶段进行。首先,按照这些规则,将项目依次放在一系列的堆栈中:
一开始没有堆栈
第一个项形成一个只包含该项的新堆栈。
每个后续项都放在最左边的堆栈上,其顶部项大于或等于项;如果所有顶部项都小于项,则该项在所有现有堆栈的右侧形成一个新堆栈。
当没有更多的项目要放置时,通过重复选择最小的可见项来恢复排序序列。可见项目是堆栈顶部的项目。
例如,考虑使用耐心排序技术对整数序列(4 3 9 1 5 2 7 8 6)进行排序。第一个堆栈得到4和3。由于9大于3,它启动第二个堆栈,1在第一个堆栈上,然后在第二个堆栈上5和2。此时,第一个堆栈(从上到下)由(13 4)组成,第二堆栈由(2 5 9)组成,其余的序列由整数(7 8 6)组成。现在7个在第三个堆栈上,8个在第四个堆栈上,6个在第三个堆栈中的第7个上面。放置所有项后,从第一堆栈收集1,从第二堆栈收集2,从第一堆栈收集3和4,从第二堆栈收集5,从第三堆栈收集6和7,从第四堆栈收集8,从第二堆栈收集9。
分配
项表示为整数(int)。项堆栈表示为list (list),其中第一个元素是堆栈顶部的项,最后一个元素是堆栈底部的项。彼此相邻的一系列堆栈被表示为一个列表( list ),其中第一个元素是最左边的堆栈,最后一个元素是最右边的堆栈。
定义一个类PatienceSorter,该类可以使用耐心排序技术按递增顺序对一系列项进行排序。类必须至少支持以下方法:
返回当前堆栈系列(列表)的方法堆栈。
返回当前堆栈数(int)的方法stack_count。
返回所有堆栈(int)中当前项数的方法item_count。
获取项的方法add_item。根据耐心排序技术的规则,给定的项必须放在现有的或新的堆栈的顶部。该方法必须返回对调用该方法的对象的引用。
获取项的序列(列表(列表)或元组( tuple ))的方法add_items。根据耐心排序技术的规则,给定的项必须一个一个地放置在现有的或新的堆栈的顶部。该方法必须返回对调用该方法的对象的引用。
我尝试过使用init函数,但是如果我运行我得到的程序: AttributeError:'NoneType‘对象没有属性’堆栈‘,就会有问题。
class PatienceSorter:
def __init__(self):
self.stapel = []
def stacks(self):
return self.stapel
def stack_count(self):
return len(self.stacks())
def item_count(self):
aantal = 0
for item in self.stacks():
aantal += len(item)
return aantal
def add_item(self, item):
if self.stack_count() == 0:
self.stacks().append(item)
else:
toegevoegd = False
for object in self.stacks():
toegevoegd = False
laatste = object[len(object) - 1]
if laatste > item:
object.append(item)
toegevoegd = True
if not toegevoegd:
self.stacks().append(item)
return self.stacks()发布于 2019-08-13 04:08:18
一个问题是,add_item方法只在self.stack_count() != 0时返回。如果是self.stack_count() == 0,则该方法将项附加到self.stacks(),然后返回None。因此,您最终会调用None.stacks(),从而导致错误。
此外,您还说过“方法必须返回对调用该方法的对象的引用”。在这种情况下,对象是self,所以您应该返回self,而不是self.stacks()。
将返回语句更改为self并修复缩进,从而不管self.stack_count()如何调用它,都可以防止错误发生。但是,我不能说算法的准确性,因为我没有看过它。
def add_item(self, item):
if self.stack_count() == 0:
self.stacks().append(item)
else:
toegevoegd = False
for object in self.stacks():
toegevoegd = False
laatste = object[len(object) - 1]
if laatste > item:
object.append(item)
toegevoegd = True
if not toegevoegd:
self.stacks().append(item)
return self我认为堆栈溢出有禁止添加代码屏幕截图的策略,所以请确保下次以文本格式包含屏幕快照。
发布于 2019-08-13 04:56:13
代码中仍然有一个错误:
self.stacks().append(item)这一行将项附加到堆栈列表中。当它实际上应该附加一个包含该项目的新列表时。这就是守则应该是:
self.stacks().append([item])其职能应是:
def add_item(self, item):
if self.stack_count() == 0:
self.stacks().append([item])
else:
toegevoegd = False
for stack in self.stacks():
toegevoegd = False
laatste = stack[-1]
if laatste > item:
stack.append(item)
toegevoegd = True
if not toegevoegd:
self.stacks().append([item])
return self如果允许提前返回,则可以消除布尔变量:
def add_item(self, item):
if self.stack_count() == 0:
self.stacks().append([item])
else:
for stack in self.stacks():
laatste = stack[-1]
if laatste > item:
stack.append(item)
return self
self.stacks().append([item])
return selfhttps://stackoverflow.com/questions/57470842
复制相似问题