首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在类中创建空列表,是否需要使用__init__函数,这是个问题吗?

如何在类中创建空列表,是否需要使用__init__函数,这是个问题吗?
EN

Stack Overflow用户
提问于 2019-08-13 03:42:54
回答 2查看 1.6K关注 0票数 0

我有一个关于我的代码的问题,在这个问题中我需要使用'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‘对象没有属性’堆栈‘,就会有问题。

代码语言:javascript
复制
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()

这就是我运行程序时得到的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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()如何调用它,都可以防止错误发生。但是,我不能说算法的准确性,因为我没有看过它。

代码语言:javascript
复制
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

我认为堆栈溢出有禁止添加代码屏幕截图的策略,所以请确保下次以文本格式包含屏幕快照。

票数 0
EN

Stack Overflow用户

发布于 2019-08-13 04:56:13

代码中仍然有一个错误:

代码语言:javascript
复制
self.stacks().append(item)

这一行将项附加到堆栈列表中。当它实际上应该附加一个包含该项目的新列表时。这就是守则应该是:

代码语言:javascript
复制
self.stacks().append([item])

其职能应是:

代码语言:javascript
复制
 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

如果允许提前返回,则可以消除布尔变量:

代码语言:javascript
复制
 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 self
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57470842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档