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

How to create an empty list in a class, do I need to use the __init__ function is this problem?

我对我的代码有疑问,我需要在这个问题中使用'init'函数吗?我试过用,但不知道哪里出错了。

这是比利时根特大学的作业

“可以使用一种受 Patience 纸牌游戏启发的技术按递增顺序对一系列项目进行排序。排序分两个阶段完成。首先,将项目一个接一个地放置在一系列堆栈中遵守这些规则:

最初没有堆栈

第一个项目形成一个新的堆栈,只包含该项目

每个后续项目都放在最左边的堆栈上,其顶部项目大于或等于 item ;如果所有顶部项目都小于 item ,则该项目在所有现有堆栈的右侧形成一个新堆栈

当没有更多的项目要放置时,通过反复挑选最小的可见项目来恢复排序序列。可见项目是堆栈顶部的项目。

例如,考虑使用 Patience 排序技术对整数序列 (4 3 9 1 5 2 7 8 6) 进行排序。第一堆得到 4 和 3。由于 9 大于 3,它开始第二堆,1 进入第一堆,然后 5 和 2 进入第二堆。此时,第一个堆栈(从上到下)由 (1 3 4) 组成,第二个堆栈由 (2 5 9) 组成,其余序列由整数 (7 8 6) 组成。现在 7 进入第三层,8 进入第四层,6 进入第三层 7 的顶部。放置所有物品后,从第一堆收集 1 个,从第二堆收集 2 个,从第一堆收集 3 和 4 个,从第二堆收集 5 个,从第三堆收集 6 和 7 个,从第四堆收集 8 个,从第四堆收集 9 个第二个堆栈。

作业

项目表示为整数 (int)。项目堆栈表示为列表(列表),其中第一个元素是堆栈顶部的项目,最后一个元素是堆栈底部的项目。一系列相邻的栈表示为一个列表(list),其中第一个元素是最左边的栈,最后一个元素是最右边的栈。

定义一个 class PatienceSorter,它可用于使用 Patience 排序技术按升序对一系列项目进行排序。 class 必须至少支持以下方法:

一种方法堆栈return当前堆栈系列(列表)。

一种方法stack_count return 是当前堆栈数 (int)。

一种方法item_count return所有堆栈中项目的当前数量(整数)。

一种获取项目的方法add_item。根据 Patience 排序技术的规则,给定的项目必须放在现有或新堆栈的顶部。该方法必须 return 对调用该方法的对象的引用。

一种方法add_items,它接受项目的序列(列表(list)或元组(tuple))。根据 Patience 排序技术的规则,给定的项目必须一个接一个地放置在现有或新堆栈的顶部。该方法必须 return 对调用该方法的对象的引用。

我尝试使用 init 函数,但出现问题 如果我 运行 我得到的程序: AttributeError: 'NoneType' 对象没有属性 'stacks'

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()

This is what I get when I run the program

一个问题是 add_item 方法在 self.stack_count() != 0 时仅 returns。如果 self.stack_count() == 0,该方法将项目附加到 self.stacks(),然后是 returns None。因此,您最终调用 None.stacks(),导致错误。

另外,你说"The method must return a reference to the object on which the method was called."这种情况下,对象是self,所以你应该returnself,而不是self.stacks()

将您的 return 语句更改为 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

我认为 stack overflow 有禁止添加代码截图的政策,所以下次一定要包含文本格式的截图。

代码还是有错误:

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

布尔变量如果允许早点可以去掉return:

 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