【问题标题】:I can't print each element in a queue我无法打印队列中的每个元素
【发布时间】:2015-07-28 02:42:23
【问题描述】:

我是一个完全的编程初学者。我创建了“队列”类,向其中添加了一些元素,并尝试按如下方式打印队列的每个元素,但我做不到。请帮我! 提前致谢!

为格式化而编辑

class queue:
    def __init__(self):
        self.items = []


    def isempty(self):
        return self.items == []

    def enqueue(self,item):
        self.items.insert(0,item)

    def dequeue(self):
        return self.items.pop()

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

    def peek(self):
        return self.items[len(self.items)-1]

q=queue()

q.enqueue(1)
q.enqueue(2)
q.enqueue(3)

for n in q():
    print "This time, it's: "+ str(n)

【问题讨论】:

  • ,我在提交问题之前忘记将元素排入队列!
  • 请记住,队列用户应该无权访问它的任何元素,除了下一个要出队的元素。
  • @EmilianoSorbello 不一定。 Python 自己的deque 允许索引以及入队/出队操作,尽管速度是 O(n)。

标签: python queue


【解决方案1】:

你必须在队列中加入一些东西才能打印出来!

你上课后的这段代码

q=queue()
q.enqueue(3)
q.enqueue(4)
q.enqueue(55)

for n in q():
    print "This time, it's: "+ str(n)

【讨论】:

    【解决方案2】:

    你永远不会把任何东西放在队列中。所以它是空的。因此没有任何东西被打印出来。尝试添加一些对象(调用函数 q.enqueue),然后它们可能会打印出来。

    【讨论】:

      【解决方案3】:

      您要么需要定义一个__iter__ 方法以使您的队列可迭代,要么您需要修改循环以使用您定义的方法。

      【讨论】:

        【解决方案4】:

        当您创建自己的类实现时,您必须定义该类的每一个行为,for 循环仅适用于 iterables 并且要使您的对象可迭代,您需要定义 __iter__ 方法在你的类中,每当你尝试迭代你的对象时都会隐式调用它。

        class queue:
            def __init__(self):
                self.items = []
        
        
            def isempty(self):
                return self.items == []
        
            def enqueue(self,item):
                self.items.insert(0,item)
        
            def dequeue(self):
                return self.items.pop()
        
            def size(self):
                return len(self.items)
        
            def peek(self):
                return self.items[len(self.items)-1]
        
            def __iter__(self):
                for i in self.items:
                    yield i
        
        q=queue()
        
        q.enqueue(1)
        q.enqueue(2)
        q.enqueue(3)
        
        for n in q:
            print "This time, it's: "+ str(n)
        

        【讨论】:

          【解决方案5】:

          你正在遍历一个非序列类型:

          for n in q():
              print "This time, it's: "+ str(n)
          

          这是正确的方法:

          for n in q.items:
              print "This time, it's: "+ str(n)
          

          【讨论】:

            【解决方案6】:

            这里q 是instance 类queue。另外q 不是callable。而items 是instance 变量。所以你必须使用

            for n in q.items:
                print "This time, it's: "+ str(n)
            

            【讨论】:

            • 这可行,但使用对象的方法可能比直接访问其内部状态更好。
            【解决方案7】:

            定义 __getitem__ 魔术方法可能是使队列可迭代的最简单方法。

            class queue:
                def __init__(self):
                    self.items = []
            
                def isempty(self):
                    return self.items == []
            
                def enqueue(self,item):
                    self.items.insert(0, item)
            
                def dequeue(self):
                    return self.items.pop()
            
                def size(self):
                    return len(self.items)
            
                def peek(self):
                    return self.items[len(self.items)-1]
            
                def __getitem__(self, i):
                    return self.items[i]
            
            q=queue()
            
            q.enqueue(1)
            q.enqueue(2)
            q.enqueue(3)
            
            for n in q:
                print "This time, it's: "+ str(n)
            

            也不要使用for n in q():。那将尝试将您的队列对象作为函数调用。由于q 不是函数,所以它失败了。

            作为实现__getitem__ 的结果,您还可以通过队列对象上的索引直接引用队列中的元素。

            例如

            print q[0]   
            

            打印

            3

            【讨论】:

            • 我相信__iter__ 比@ZdaR 的答案中的__getitem__ 更可取(参见例如stackoverflow.com/a/20551346/1349673)。
            • @JamesHirschorn 感谢您提供的信息。如果用户希望通过索引访问队列元素,这仍然是一个值得的替代答案,所以我将保留它。这也是给出这种方法的唯一答案。根据您评论中提到的注意事项,其他用户应该能够做出明智的选择,是否最好使用 __iter__ 或 __getitem__。
            【解决方案8】:

            在我的情况下,import Queue 上面选择的答案不起作用。 真正有效的是:

            for i in q.queue:
                print i
            

            【讨论】:

            • 她没有使用标准库Queue 类型。她正在定义自己的queue 类。
            猜你喜欢
            • 2018-07-22
            • 2015-12-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-10
            • 2013-01-27
            相关资源
            最近更新 更多