【初心者向け】PythonのQueueとDequeの使い方:ステップバイステップガイド
Pythonのqueueは組み込みライブラリの一つで、FIFO(First In First Out:先入れ先出し)方式でデータを扱うリストを作成できます。一方、deque(デック)はリストの両端から要素を追加・削除できる「両端キュー」で、使い方次第でLIFO(Last In First Out:後入れ先出し)としても機能します。どちらもスタックやキューを実装するうえで欠かせない重要なデータ構造です。
はじめに:なぜキューが必要なのか
Pythonでプログラムを書いていると、単純なリストではなく「キュー」としてデータを扱いたい場面があります。例えば、カンファレンスへの参加登録を管理するプログラムを考えてみましょう。新しい参加者を追加するときは列の末尾に加え、受付が進むにつれて先頭から順に処理されていく――このような動作を実現したいとき、キューが役立ちます。
Pythonには、こうした課題を解決するための組み込みライブラリが用意されています。キューはスタックとよく似ていますが、最大の違いは取り出す要素にあります。キューでは「最も古く追加された要素」を取り出すのに対し、スタックでは「最も新しく追加された要素」を取り出します。
このチュートリアルでは、Pythonにおけるキューの基本と、その実装方法について詳しく解説します。
キューの基礎知識
キューは、データを追加した順番どおりに取り出したい場合に便利なデータ構造です。先ほどの例で言えば、カンファレンスの受付では、登録した順に列の後ろへ並び、前の人たちが入場するにつれて自分の順番が回ってきます。
キューは配列やリストとは異なり、ランダムアクセスができません。キューに格納されたデータには特定の順序があり、新しい要素は必ず末尾に追加されます。この方式は「先入れ先出し」を意味するFIFO(First In First Out)と呼ばれます。
Pythonでは標準のリストをキューとして使うことも可能です。しかし、リストの先頭付近で要素を挿入・削除すると、残りのすべての要素をずらす必要があるため、処理が遅くなりがちです。そのため、先入れ先出しの構造が必要な場合は、専用のキューライブラリを使うのがおすすめです。
PythonのQueueモジュールの使い方
それでは、Pythonでキューを実装するにはどうすればよいのでしょうか。答えは、組み込みのqueueライブラリを使うことです。queueモジュールには便利なクラスがいくつか含まれていますが、このチュートリアルではqueue.Queueクラスに焦点を当てます。
ここでは、地元の映画館で最新映画を見たい人たちの順番待ちリストを管理するプログラムを作成するとしましょう。鑑賞希望者のウェイトリストを追跡するために、キューを活用できます。
まず、キューを定義します。以下のコードを使用します。
from queue import Queue
waitlist = Queue()
これでキューを作成する準備が整いました。put()関数を使うと、データをキューに入れることができます。以下のコードでは、映画の鑑賞に申し込んだばかりの5人をウェイトリストに追加します。
waitlist.put('Erin')
waitlist.put('Samantha')
waitlist.put('Joe')
waitlist.put('Martin')
waitlist.put('Helena')
5つの名前がキューに追加されました。先頭がErin、続いてSamanthaという順になり、最後がHelenaです。これを確認するには、get()関数を使用します。
print(waitlist.get())
このコードは以下を出力します。
Erin
ご覧のとおり、キューの先頭にあるErinが最初に取り出されました。先頭の2つの名前を表示したい場合は、get()関数を2回呼び出します。
print(waitlist.get())
print(waitlist.get())
このコードは以下を出力します。
Erin
Samantha
PythonのDeque(両端キュー)の実装例
では、キューの両端から要素を追加・削除したい場合はどうすればよいのでしょうか。そこで登場するのがdequeです。dequeを使うと両端キュー(double-ended queue)を作成でき、キューの先頭または末尾のどちらからでも要素を追加・削除できます。dequeはLIFO(後入れ先出し)の操作にも対応しており、スタックとしてもキューとしても使える柔軟なデータ構造です。
同じ例を使って、映画のウェイトリストをdequeで管理してみましょう。まず、dequeを宣言します。
from collections import deque
waitlist = deque()
dequeを初期化したら、ウェイトリストの名前を追加していきます。
waitlist.append('Erin')
waitlist.append('Samantha')
waitlist.append('Joe')
waitlist.append('Martin')
waitlist.append('Helena')
ご覧のとおり、append()関数を使ってキューに要素を追加しました。ウェイトリストに格納された値を確認するには、次のコードを使用します。
print(waitlist)
このコードは以下を出力します。
deque(['Erin', 'Samantha', 'Joe', 'Martin', 'Helena'])
データは挿入した順序どおりに格納されています。では、キューの先頭の要素を削除したい場合はどうでしょう。それにはpopleft()関数を使用します。例を見てみましょう。
waitlist.popleft()
print(waitlist)
このコードはリストの先頭の要素であるErinを削除し、以下を出力します。
deque(['Samantha', 'Joe', 'Martin', 'Helena'])
deque内のすべての要素を削除したい場合は、clear()関数を使用します。
waitlist.clear()
print(waitlist)
このコードの実行結果は以下のとおりです。
deque([])
ご覧のとおり、dequeの中身は空になりましたが、オブジェクト自体はまだ存在しています。
まとめ
以上で解説は終わりです。この記事では、キューがFIFO(先入れ先出し)方式でデータを格納できるデータ構造であること、そしてその活用例として新製品のウェイトリスト管理などが挙げられることを紹介しました。
また、dequeを使えば、キューの両端から要素を追加・削除できる両端キューを作成できることも解説しました。これであなたも、独自のキューやdequeを記述する準備が整いました。ぜひ実際にコードを書いて、それぞれの違いを体感してみてください。
-
Pythonインタープリターとは?仕組みと初心者向けオンライン環境を徹底解説
Pythonは学びやすいプログラミング言語として知られています。その理由のひとつが、自分のマシンに正しいバージョンのPythonをインストールしなくても、オンラインで利用できるPythonインタープリターが数多く存在する点です。本記事では、Pythonインタープリターの仕組みについて解説し、初心者にも使いやすい人気のオンラインインタープリターをご紹介します。 Pythonプログラムはどのように実行されるのか? PythonはJavaと同様に、純粋なインタプリタ言語ともコンパイラ言語とも分類できず、両方の性質を併せ持っています。 ここでいう「コンパイル」とは、特定のプラットフォームに依存し
-
Pythonで解く「鍵と部屋」問題:BFSで全ての部屋を訪問できるか判定する方法
N個の部屋があり、部屋0からスタートするとします。各部屋には0、1、2、…、N-1の中から一意な番号が割り当てられており、それぞれの部屋には次の部屋へ入るための鍵がいくつか置かれていることがあります。言い換えると、各部屋iにはrooms[i]という鍵のリストが存在し、各鍵rooms[i][j]は[0, 1, …, N-1]の範囲の整数です(ここでNは部屋の総数)。鍵rooms[i][j] = vは、番号vの部屋を開けられることを意味します。例えば、入力が[[1], [2], [3], []]であれば、出力はtrueになります。問題を解く前に押さえておきたいポイント最初、すべての部屋は施錠されて