OK、あなたの質問に対するレイモンド・ヘッティンガーの解釈は正しいと思います。あなたのコメントは、キューの長さではなく、すべてのファイルサイズの合計に関心があることを明確にしています。その方がずっと理にかなっていて、やっとあなたの言いたいことが理解できてうれしいです。heapq
それを念頭に置いて、あなたが述べたすべての要件を満たすと私が信じていることに基づいた簡単な実装を次に示します。put
キューのタプルをtingして使用します。キューからアイテムを取得すると、それが最も古いファイル (つまり、タイムスタンプが最小のファイル) になることに(timestamp, filename, filesize)
注意してください。get
import heapq
class FilenameQueue(object):
def __init__(self, times_sizes_names, maxsize):
self.maxsize = maxsize
self.size = sum(s for t, s, n in times_sizes_names)
self.files = list(times_sizes_names)
heapq.heapify(self.files)
while self.size > self.maxsize:
self.get()
def __len__(self):
return len(self.files)
def put(self, time_size_name):
self.size += time_size_name[1]
if self.size < self.maxsize:
heapq.heappush(self.files, time_size_name)
else:
time_size_name = heapq.heappushpop(self.files, time_size_name)
self.size -= time_size_name[1]
def get(self):
time_size_name = heapq.heappop(self.files)
self.size -= time_size_name[1]
return time_size_name
__len__
キューから取得する前にキューをテストできるように、メソッドを追加しました。使用例を次に示します。
>>> f = FilenameQueue(((22, 33, 'f1'), (44, 55, 'f2'), (33, 22, 'f3')), 150)
>>> while f:
... f.get()
...
(22, 33, 'f1')
(33, 22, 'f3')
(44, 55, 'f2')
>>> f = FilenameQueue(((22, 33, 'f1'), (44, 55, 'f2'), (33, 22, 'f3')), 150)
>>> f.put((55, 66, 'f4'))
>>> while f:
... f.get()
...
(33, 22, 'f3')
(44, 55, 'f2')
(55, 66, 'f4')
Queue.PriorityQueue
最適ではない完全に異なるソリューションについては、私の編集履歴を参照してください。要素を破棄するのではなく、ブロックmaxsize
することで制限を適用することを忘れていました。それはあまり役に立ちません!