如何在Python中检查deque的长度

74

如何在Python中检查deque的长度?

我没有看到他们提供deque.length...

http://docs.python.org/tutorial/datastructures.html

from collections import deque
queue = deque(["Eric", "John", "Michael"])

如何检查这个双端队列的长度?

我们可以像这样初始化吗?

queue = deque([])   #is this length 0 deque?

4
你尝试过使用 len(queue) 吗?通常这是Python处理元素计数的方式。 - mjgpy3
print(len(my_queue.queue)) 对我有用。 - rustyMagnet
1
我犹豫是否应该编辑一个有这么多赞的问题,但我认为在问题标题和正文中使用一个不同于“队列”的词语是有道理的,因为许多关于Python Queue的谷歌搜索结果都会指向这里,而被接受的答案对于Queue将不起作用。(是的,我知道deque也是队列的一种类型——在这种情况下只是一个不幸的词...) - Colin T Bowers
要计算 queue.Queue(或 multiprocessing.Queue)对象的长度,请参考 Get length of Queue in Python's multiprocessing library - Stack Overflow - user202729
4个回答

82

len(queue)应该给你结果,即在这种情况下为3。

具体来说,len(object)函数会调用object.__len__方法[参考链接]。而在这种情况下的对象是deque,它实现了__len__方法(你可以通过dir(deque)查看)。


queue= deque([])   #is this length 0 queue?

空的deque会返回 0。


14
属性错误:队列实例没有'len'属性。我使用了qsize()代替。参考链接:https://docs.python.org/2.7/library/queue.html - otgw
9
@备忘录:请阅读问题正文。collections.dequequeue.Queue是不同的。后者预期在多线程情况下使用,其中大小可能会在另一个线程中更改。 - jfs
4
这个答案是错误的。根本就没有这样的属性。 - ABCD
2
@SmallChess 你确定吗?collections.deque绝对存在,这也是问题所问的。根据文档:https://docs.python.org/3/library/collections.html#deque-objects,在该部分的末尾...“除了上述内容,deque还支持迭代、pickling、**len(d)**…”(重点在于len(d))。 - rayryeng
1
@SmallChess,请确保它是queue=deque([]),而不是queue=deque()。 - Jiaji Li

63

很简单,只需使用.qsize()函数。

a=Queue()
a.put("abcdef")
print a.qsize() #prints 1 which is the size of queue

以上代码片段适用于Python的Queue()类。感谢@rayryeng的更新。

对于collections中的deque,我们可以像这里所述的那样使用len()函数,由K Z提供。


11
请注意,这是针对Queue类的说明,它与collections.deque中的不同,而后者才是OP实际要求的。 - rayryeng
@rayryeng,但它确实让像我这样的谷歌用户得到了他们所期望的答案!不确定为什么queue.Queue类没有常规长度... - gerrit

1

是的,我们可以检查从collections创建的队列对象的长度。

from collections import deque
class Queue():
    def __init__(self,batchSize=32):
        #self.batchSie = batchSize
        self._queue = deque(maxlen=batchSize)

    def enqueue(self, items):
        ''' Appending the items to the queue'''
        self._queue.append(items)

    def dequeue(self):
        '''remoe the items from the top if the queue becomes full '''
        return self._queue.popleft()

创建一个类的对象。
q = Queue(batchSize=64)
q.enqueue([1,2])
q.enqueue([2,3])
q.enqueue([1,4])
q.enqueue([1,22])

现在正在获取队列的长度。
#check the len of queue
print(len(q._queue)) 
#you can print the content of the queue
print(q._queue)
#Can check the content of the queue
print(q.dequeue())
#Check the length of retrieved item 
print(len(q.dequeue()))

请查看附加的屏幕截图以获取结果。

enter image description here

希望这可以帮到您…

-7
使用 queue.rear+1 来获取队列的长度。

1
不会的。在Python语言中没有任何队列中看到rear属性,至少不在核心堆栈中。 - rayryeng
这是Python中的collections.deque,而不是你在大学里的循环队列作业。 - nurettin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接