Python while while循环popleft() - 错误:空双端队列

时间:2013-03-01 08:08:08

标签: python list indexing while-loop deque

我正在寻找一个更优雅的解决方案。我的deques是动态创建的,长度可以不同。在下面的示例中,列表只有两个项目,最长可达3个项目。在我的应用程序中,列表最多可以包含30个项目。因此,我想避免编写大量的if语句,并在deque为空时让代码停止执行。

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:从空双端队列弹出”。我理解为什么会发生这种错误,但是想知道我是否缺少一个技巧来评估列表/双端队列是否为空循环(或循环通过长列表的另一种创造性方式)

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

您可以使用与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构成一个工作单元,那么将它们组合成一个元组并将其排入队列可能更好。

答案 1 :(得分:1)

您可以捕获IndexError:

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

你想做什么?为什么要检查mydeque是否为空?

答案 2 :(得分: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

如果pops发生在循环代码的广泛分离的部分中,你可以为每个部分使用单独的try / except块,而不是将整个部分包装在一个。