Python while 循环 popleft() - 错误:空的 deque
我在寻找一个更优雅的方式来处理这个循环。我的双端队列(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
不过,如果alpha
、beta
和gamma
这三个东西可以看作一个整体工作单位,那么把它们放在一起,形成一个元组,然后再放入队列可能会更好。
5
你可以捕捉到索引错误(IndexError):
try:
while mydeque:
alpha = mydeque.popleft()
beta = mydeque.popleft()
gamma = mydeque.popleft()
except IndexError:
# handle empty mydeque
你想做什么呢?为什么想检查一下 mydeque 是否为空呢?