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
このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です