2015-09-29 24 views
1

我在寫一個腳本,它使用一個隊列來跟蹤長度爲N的列表的最後六個數字。換句話說,當我迭代長度爲N的列表時,我想跟蹤最後六個數字。我認爲隊列將是一個很好的結構,因爲當我推入新號碼時,它會自動推出最後的第6個號碼。我的代碼如下:如何查看整個隊列內容和自動隊列推出

if __name__ == '__main__': 

    data = [1,23,45,5,43,2,54,2,34,32] 
    scub = DataScrubber(data) 
    scub.scrub_zeros(0.01) 

    print "TEST" 


def scrub_zeros(self,upperzero_range): 
     scrubbed_data = [] 
     last_6_data_points = Queue.Queue(6) 

     for data in self.data: 
      print last_6_data_points 
      print scrubbed_data 
      last_6_data_points.put(data) 
      scrubbed_data.append(data) 
     self.data = scrubbed_data 

當我運行該腳本,我得到以下的輸出:

<Queue.Queue instance at 0x03E25D00> 
[] 
<Queue.Queue instance at 0x03E25D00> 
[1] 
<Queue.Queue instance at 0x03E25D00> 
[1, 23] 
<Queue.Queue instance at 0x03E25D00> 
[1, 23, 45] 
<Queue.Queue instance at 0x03E25D00> 
[1, 23, 45, 5] 
<Queue.Queue instance at 0x03E25D00> 
[1, 23, 45, 5, 43] 
<Queue.Queue instance at 0x03E25D00> 
[1, 23, 45, 5, 43, 2] 

然而,這個腳本從未停止運行。它凍結了,我必須用ctrl + break分解。所以思考後,我找出了它爲什麼會凍結的原因。它凍結,因爲當我將「放入」數據到隊列中時,不會自動推送隊列另一端的舊數據。所以我猜想隊列被卡住了。我是否錯過了一些東西,難道這不是一個隊列的作用點嗎?我必須打電話「獲得」嗎?無論如何不得不爲隊列調用另一個函數,當新數據被推入隊列時它會自動推出最舊的數據?

我的第二個問題:

如何查看就像一個列表整個隊列?所以:

print my_queue 

結果:

[null,1, 23, 45, 5, 43] 

推入5號到6號線隊列之後。

回答

2

Queue當它們達到最大尺寸時,它們不會驅逐條目,它們在您嘗試put時會阻止一個條目超過它們的最大尺寸(這就是您的程序停滯的原因)。它們專爲原子線程間通信而設計,因此查看它們的內容不是設計目標,而是以線程安全的方式(適當時阻塞)允許線程安全地運行。

既然你不使用線程間手斷帶的Queue攔截功能,你真的不想要一個Queue可言,你想collections.deque一個maxlen

from collections import deque 

... 

def scrub_zeros(self,upperzero_range): 
    scrubbed_data = [] 
    last_6_data_points = deque([None]*6, maxlen=6) 

    for data in self.data: 
     print last_6_data_points 
     print scrubbed_data 
     last_6_data_points.append(data) 
     scrubbed_data.append(data) 
    self.data = scrubbed_data 

deque的字符串將顯示元素,但它將包含額外的kruft;如果你想要它看起來像list -like沒有kruft,請將print更改爲print list(last_6_data_points)

+0

這將爲未填充的條目輸出「None」,而不是「null」,但我假設沒關係。如果你願意的話,你可以把它改成'str',''null''(儘管它會用引號打印);如果這是不可接受的,你需要自己格式化輸出,而不是依賴'list'' repr'來爲你做。 – ShadowRanger

+0

null是僞代碼。我會仔細看看你的代碼。謝謝。 – bud

+0

@budder:好的。通常情況下,我會省略初始值設定項,並且只需要一個'maxlen',因爲填充條目並不能真正爲您帶來任何收益,但您的示例顯示了填充項,所以我提供了它。如果您不需要填充符,只需使用以下語句進行初始化:'last_6_data_points = deque(maxlen = 6)' – ShadowRanger