我正在寻找一个更优雅的解决方案。我的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:从空双端队列弹出”。我理解为什么会发生这种错误,但是想知道我是否缺少一个技巧来评估列表/双端队列是否为空循环(或循环通过长列表的另一种创造性方式)
感谢您的帮助。
答案 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
但是,如果alpha
,beta
和gamma
构成一个工作单元,那么将它们组合成一个元组并将其排入队列可能更好。
答案 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块,而不是将整个部分包装在一个。