2014-02-12 88 views
3

假設我們有dequemaxlen=3。如果deque已經有3個項目,並且我append一個新項目,我如何獲得將被丟棄的項目?如何讓物品在python deque中被丟棄?

原因是我想在內存中保留一個只包含最後N項的窗口,並且當窗口已滿並且一個項目將被丟棄時,我需要獲取該項目並執行一些額外的工作。

這是我目前的解決方案:

from collection import deque 

MAX_LEN=10 

q = deque(maxlen=MAX_LEN) 

while True: 
    if len(q) == MAX_LEN: 
     discarded = q.popleft() 
     process(discarded) 
    q.append(some_var) 

這是最好的我能得到什麼?我想過使用list和切片清單來限制大小/丟棄物品,但if是不可避免的。使用deque至少我可以在pushpopleft操作中獲得O(1)的性能。

任何想法?

+1

爲什麼不'處理(Q [0]); q.append(some_var)'? – Bakuriu

+0

@Bakuriu我需要處理一個被丟棄的。所以隊列從0項開始,當它到達3項時,我需要開始處理'q [0]'。我只是想避免循環中的「if」比較。 – yegle

+0

你的代碼沒有問題,我也不認爲你可以做得更好。雖然你*可以*擺脫'丟棄'變量。你*可以*創建一個新的子類來爲你做這個 – goncalopp

回答

0

像這樣的東西可能適合你。成對函數的

def pairwise(iterable, n=2): 
    from itertools import tee, islice, izip 
    return izip(*(islice(it,pos,None) for pos,it in enumerate(tee(iterable, n)))) 


for values in pairwise(infinite_iterable_generating_your_values, n=3): 
    process(values[0]) 
    if breakconditions: 
     break 

例如:

print [i for i in pairwise(range(10), n=3)] 

[(0, 1, 2), (1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7), (6, 7, 8), (7, 8, 9)]