3

我正在为这个循环寻找一个更优雅的解决方案。我的双端队列是动态创建的,长度可能不同。在下面的示例中,列表只有两个项目长,最多可以有 3 个项目长。在我的应用程序中,列表最多可以包含 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: pop from an empty deque”。我理解为什么会发生这个错误,但想知道我是否缺少一个技巧来评估列表/双端队列在 while 循环中间是否为空(或另一种循环遍历长列表的创造性方法) .

谢谢您的帮助。

4

3 回答 3

5

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

但是,如果alphabeta构成gamma一个工作单元,则将它们组合成一个元组并将其加入队列可能是一个更好的主意。

于 2013-03-01T08:11:22.423 回答
5

您可以捕获 IndexError:

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

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

于 2013-03-01T08:12:05.877 回答
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

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

于 2013-03-01T09:44:03.080 回答