Pythonでキューを使う
Pythonにおけるキューの使い方。
基本的な使い方
基本的なFIFOキューの使い方です。
import queue
q = queue.Queue()
print("start insert")
q.put("1")
q.put("2")
q.put("3")
q.put("4")
print("end of insert")
while not q.empty():
print(q.get())
#;
出力結果
start insert
end of insert
1
2
3
4
queue.empty()
メソッドはキューが空の場合にTrueを返し、それ以外の場合はFalseを返します。
queue.put()
メソッドはキューにアイテムを入れます。
queue.get()
メソッドはキューから先頭のアイテムを取り除き、それを返します。オプション指定なしの場合、アイテムが取り出せるようになるまでブロックします。
キューの個数を取得する
queue.qsize()
メソッドでキューのサイズを取得できます。
import queue
q = queue.Queue()
print(q.qsize()) # 0
q.put("1")
print(q.qsize()) # 1
q.put("2")
print(q.qsize()) # 2
q.get()
print(q.qsize()) # 1
キューの上限を設定する
キュー生成時にキューの上限を設定できます。
注意点としては、キューが満杯になった場合は、キューに値を入れることができなくなります。
import queue
q = queue.Queue(2)
q.put("1")
print(q.full()) # False
q.put("2")
print(q.full()) # True
queue.full()
メソッドはキューが満杯の場合にTrue
を返し、それ以外の場合はFalse
を返します。
キューが満杯の場合、queue.put()
メソッドもブロックされるので、注意が必要です。
キューの上限を設定する(collections.dequeを使う)
キューの上限を超える場合に、アイテムの追加でブロックせずに古いアイテムを削除したい場合は、collections.deque
を使います。
import collections
q = collections.deque([], 2)
q.append("1")
q.append("2")
q.append("3")
while 0 < len(q):
print(q.popleft())
#;
出力結果
2
3
deque.popleft()
メソッドは先頭のアイテムを取り除き、それを返します。
LIFOで使う
deque.pop()
メソッドは末尾のアイテムを取り除き、それを返します。
import collections
q = collections.deque([], 2)
q.append("1")
q.append("2")
q.append("3")
while 0 < len(q):
print(q.pop())
#;
出力結果
3
2
ただし、deque.popleft()
メソッド、deque.pop()
メソッドともにキューの内容が空の場合はエラーとなるため、注意が必要です。
import collections
q = collections.deque([], 2)
print(q.popleft())
出力結果
Traceback (most recent call last):
File "index.py", line 4, in <module>
print(q.popleft())
IndexError: pop from an empty deque