Python while 循环 popleft() - 错误:空的 deque

4 投票
3 回答
23556 浏览
提问于 2025-04-17 17:33

我在寻找一个更优雅的方式来处理这个循环。我的双端队列(deque)是动态创建的,长度可能会变化。在下面的例子中,列表只有两个项目,最多可以有三个项目。在我的应用中,列表的长度可以达到30个项目。因此,我想避免写很多的if语句,并希望在双端队列为空时,代码能够停止执行。

from collections import deque

my_list = [ 1,2 ]
my_deque = deque ( my_list )

while my_deque:
    alpha = my_deque.popleft()
    beta = my_deque.popleft()
    gamma = my_deque.popleft()

上面的代码会执行所有三个命令,而在执行到gamma命令时,会返回一个“IndexError: 从空的deque中弹出”。我明白这个错误发生的原因,但我想知道在while循环中,是否有什么技巧可以用来判断一个列表或双端队列是否为空(或者有没有其他更聪明的方法来遍历一个长列表)。

谢谢你的帮助。

3 个回答

0

如果你提前知道要从队列中取出多少个项目,你可以让循环的条件是队列里至少有那么多准备好的项目:

while len(my_deque) >= 3:
    alpha = my_deque.popleft()
    beta = my_deque.popleft()
    gamma = my_deque.popleft()

    # do stuff with alpha/beta/gamma here

如果你不知道可能会请求多少个项目,你可以采取一种“事后求情比事前请求许可更简单”的方法,直接不加条件地循环:

while True:
    try:
        alpha = my_deque.popleft()
        if alpha > 0:
            beta = my_deque.popleft()
            gamma = my_deque.popleft()
        else:
            beta = 0
            gamma = 0
    except IndexError:
        break

    # do stuff with alpha/beta/gamma here

如果在循环代码的不同部分取出项目,你可以为每个取出操作使用单独的try/except块,而不是把整个代码包裹在一个块里。

6

你可以像在while循环中那样检查,方法是完全一样的:

while my_deque:
    alpha = my_deque.popleft()
    beta = my_deque.popleft() if my_deque else None
    gamma = my_deque.popleft() if my_deque else None

不过,如果alphabetagamma这三个东西可以看作一个整体工作单位,那么把它们放在一起,形成一个元组,然后再放入队列可能会更好。

5

你可以捕捉到索引错误(IndexError):

try:
    while mydeque:
        alpha = mydeque.popleft()
        beta = mydeque.popleft()
        gamma = mydeque.popleft()
except IndexError:
    # handle empty mydeque

你想做什么呢?为什么想检查一下 mydeque 是否为空呢?

撰写回答