2013-03-01 61 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 

如果彈出恰巧在循環代碼的廣泛分離的部分,你可以使用不同的嘗試/除了他們每個人的塊,而不是包裝整個在一個單一的東西。