【问题标题】:return random values from a stack python从堆栈python返回随机值
【发布时间】:2019-04-26 14:10:45
【问题描述】:

我正在尝试从堆栈中返回 5 个值并将其显示出来。请问我该怎么做?

附上我如何解决问题的代码。

import random
class Stack:
    def __init__(self):
        self.stack = []

    def isEmpty(self):
         return self.size() == 0   

    def push(self, item):
         self.stack.append(item)  

    def peek(self) :
         if self.size()>0 :
             return self.stack[-1]
         else :
             return None

    def pop(self):
         return self.stack.pop()  

    def size(self):
         return len(self.stack)

    def randomFive(self):
        return self[random.randint(0,len(self)-1)]
list = Stack()
list.push("Tom")
list.push("John")
list.push("Peter")
list.push("Harry")
list.push("Jerry")

for i in range(0, list.size()):
    five = list.randomFive()

显示的错误是:

return self[random.randint(0,len(self)-1)]    
TypeError: object of type 'Stack' has no len()

【问题讨论】:

  • 尽量不要覆盖像list这样的内置对象的名称
  • 还有self[random.randint(0,len(self)-1)] 可能应该是self[random.randint(0,len(self.stack)-1)] 或者你应该定义__len__ 方法
  • 我已经尝试了这两种方法,但仍然有一个错误,上面写着return(self[random.randint(0,len(self.stack)-1)]) AttributeError: 'Stack' object has no attribute 'stack

标签: python python-3.x random stack


【解决方案1】:

错误是由randomFive方法中的语句引起的

self[random.randint(0,len(self)-1)]

因为selfStack 的一个实例,它没有可用的__len__ method,对于用户定义的类len built-in function 尝试调用它并在没有任何可用时引发错误(更多信息在this thread )。

快速解决方法是将其更改为

self[random.randint(0,len(self.stack)-1)]

但从长远来看,最好定义自己的 __len__ 方法,例如

class Stack:
    ...
    def __len__(self):
        return len(self.stack)

之后你原来的 randomFive 方法应该可以工作了。

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2014-09-06
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多