0
0

More than 1 year has passed since last update.

【Python】最大長が決まっているqueueが欲しい時は

Last updated at Posted at 2021-10-31

Pythonでqueue構造を使うにはqueue.Queue()があります。
しかし、これはqueueの長さを一定までにして、それを超える場合には古いものから取り除かせたい場合にはあまり向いていません。
リファレンスによると
queue.Queue()の引数で最大長が決められますが、queueがいっぱいの時は例外を送出し、
新規挿入はqueueが空くまでブロックするようです(待機させる)。
また、現在の要素数を得ようとしてもQueue.qsize()というメソッドはありますが、これは長さの近似値を返すのみです。
よって最大長を設けたい場合はかなり処理が面倒になります。

ではどうするか

collections.deque()を使うと、すぐに今回ほしい形のqueueが得られます。

dequeの例(最大サイズ3)
import collections
q = collections.deque([], 3)

for i in range(5):
    q.append(i)
    print(q)

上記のコードを実行すると以下のような出力が返ってきます。

例の出力
deque([0], maxlen=3)
deque([0, 1], maxlen=3)
deque([0, 1, 2], maxlen=3)
deque([1, 2, 3], maxlen=3)
deque([2, 3, 4], maxlen=3)

最大サイズ3未満まではそのままデータが追加され、
サイズが3になったら先頭の古いデータが消えて、末尾に新しいデータが追加されます(FIFO)。

collections.deque([], 3)
でdequeを作成します。
一番目の引数が初期データ、二番目の引数が最大サイズとなっています。

データを末尾に追加する場合は
q.append()

データを先頭に追加したい場合は
q.appendleft()

末尾のデータをpopして取得したい場合は
q.pop()

先頭のデータをpopして取得したい場合は
q.popleft()

現在の要素数の取得は
len(q)

となっています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0