2013-03-01 33 views
1

我正在寻找这个循环的更优雅的解决方案。我的deques是动态创建的,可能会有所不同。在下面的例子中,列表只有两个项目长,可能长达3个项目。在我的应用程序中,列表最多可以有30个项目。因此,我希望避免编写大量的if语句,并且一旦deque为空就让代码停止执行。Python while while循环popleft() - 错误:空的双端队列

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() 

上面的代码执行所有三个命令和上伽玛命令返回一个“IndexError:从空双端队列弹出”。我明白为什么会出现这个错误,但想知道是否有一个技巧我缺少来评估一个list/deque在while循环中间是否为空(或另一种创造性的方式来循环一个长列表) 。

感谢您的帮助。

回答

1

可以赶上IndexError:

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

你到底想干什么?你为什么要检查mydeque是空的?

+0

这工作。伽马实际上是字典中的关键。我认为try/except使得try或try中的所有代码都必须执行。没有意识到在异常之前执行的任何东西仍然会被执行。谢谢! – ccdpowell 2013-03-01 08:19:28

+1

@ccdpowell:但要小心,如果有可能其他部分的代码也可能会引发IndexError,try-except也可能会引发这种情况。除了在while循环内部放置这个try可能会更好,只能围绕你拥有mydeque.popleft()的部分,但这取决于你想要做什么。 – 2013-03-01 08:25:33

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构成一个工作单元,它可能是一个更好的主意来组合把它们变成一个元组,然后排队。

+0

当我用if语句代替while语句执行我的代码块时,它仍然不起作用。同样的错误。从追踪:“回溯(最近通话最后一个): 文件‘test.py那不是我:: – ccdpowell 2013-03-01 08:16:25

+1

@ccdpowell’,9号线,在 伽马= my_deque.popleft() IndexError从空双端队列弹出”意思。你需要在每个'popleft()'*之前检查队列中的空虚。我更新了代码,希望更清楚。 – NPE 2013-03-01 08:18:33

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 

如果弹出恰巧在循环代码的广泛分离的部分,你可以使用不同的尝试/除了他们每个人的块,而不是包装整个在一个单一的东西。