Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

PythonのCollectionsモジュールのdeque

Pythonのcollectionsモジュールのdequeの使い方の解説

collectionsモジュールのdequeの基本的な使い方の解説

今回はPythonに最初からついている便利なcollectionsモジュールが提供するdeque(デックと呼びます)という特殊なコンテナ型の使い方の説明です。

class collections.dequeとは?

Python公式ドキュメント:class collections.deque([iterable[, maxlen]])

dequeは特殊な型である

まずそもそもdequeとは、上公式ドキュメントにおいて次のように定義されています。

class collections.deque([iterable[, maxlen]])

つまりクラスなのですね。そしてPythonではクラスはデータの型を表すことになっていますので、これはdequeという特別な型をつくっているというわけです。

基本的な使い方

ではさっそく使ってみましょう。使い方ですが、dequeの引数については、

class collections.deque([iterable[, maxlen]])

このようにイテラブルオブジェクトが必須となっています。

省略可能な第2引数としてmaxlenと書かれていますが、dequeによって作成されたdeque型オブジェクトがいくつの構成要素を含むか、その最大の数を指定することができます。

まずcollectionsモジュールを読み込んでから、上述のようにクラスですのでインスタンスを作りましょう。イテラブルオブジェクトとして文字列”abcd”(文字列はイテラブル)を使ってみましょう。

from collections import deque
 
# 必須の第1引数(イテラブルオブジェクト)として文字列を指定
deq = deque("abcd",) 

print(deq)
type(deq)

結果は、

deque(['a', 'b', 'c', 'd'])
<class 'collections.deque'>

こうしてdeque型(collections.deque型)のオブジェクトdeqを作ることができました。

次の上のコードに、生成されるオブジェクトの最大構成要素数(maxlen)についてその指定を加えてみましょう。

deq_2 = deque("abcd",3) 
print(deq_2)

こうすると結果は、

deque(['b', 'c', 'd'], maxlen=3)

このようになります。本来なら最初の要素だった「a」がなくなっていますね。

これは次のような動作によるものです。

オブジェクトdeq_2の構成要素を最初に3つだと指定したので、3つの枠が用意される

枠1、23に順番にa、b、cが入る。これで枠がいっぱいになる

いっぱいなった枠に1つの新しい要素dを入れる

dの反対側のaの枠を1つ分捨てる

結果、b、c、dとなる。

このような仕組みになっています。追加される要素の反対側の要素が、追加される要素の個数に応じて順番に捨てられるという動作になっているわけですね。

そしてこの結果だけ見ると、結局、最初に指定したイテラブルオブジェクトの最後から3つが残っているという見方もできるわけです。そこで、応用的な使い方として次のような使い方も可能です。上の公式ドキュメントに掲載されているコードですが、

def tail(filename, n=10):
    'ファイルの最後の10行を表示'
    with open(filename) as f:
        return deque(f, n)

ここではイテラブルオブジェクトとしてファイルオブジェクトであるfilenameを指定し、最大幅として10を指定しています。それゆえ、ファイルオブジェクトfilenameの最後の10行が返されるというわけです。

deque型オブジェクトのメソッド

上のコードで作られたdeqそしてdeq_2はdeque型オブジェクトです。deque型オブジェクトは、

  • append
  • clear
  • copy
  • count

などなど多くの便利なメソッドが用意されています。

これらについて1つずつ解説するのは省きます。Python公式ドキュメント:class collections.deque([iterable[, maxlen]])をご覧ください。

dequeのメリットとデメリットは?listとの使い分けは?

メリット

さてこのようなdeuqですが、普通にPython標準のlistを使ってもdeque型が実現する機能と同じ機能を実装することは可能です。しかしPythonに最初から用意されているlistなどと比べると、

  • Deque はリストオブジェクトの最初のインデックス側と最後のインデックス側のどちらの側からでもappendとpopが可能
  • どちらの側からでもより高速で処理できる
  • スレッドセーフでメモリ効率がよい

などのメリットがあると説明されています。

デメリット

しかし、一方で上述のような両端以外の要素の処理は遅いというデメリットもあるとされています。もちろんちょっとした小さなプログラムでしたらlistだろうとdequeだろうと現実的に問題となるようなレベルの差はないかもしれません。

またdequeのメソッドにはsortが用意されていません。つまり要素を自由に入れ替えることは基本的にできないわけです。

listとの使い分け

上のメリット・デメリットを考えると、個人でちょっとしたプログラムを組む程度の場合ならば、listとの使い分けについてはだいたいにおいて以下のようにすればいいのではないでしょうか。

  • 本気で処理速度を追求しないのならば、基本的にはdequeを使う
  • sortを使いたいときはlist

以上、簡単にではありますがcollectionsモジュールのdequeの使い方の解説でした。このようにcollectionsモジュールには便利なデータ型やメソッドが用意されていますので、普段からcollectionsモジュールの使い方に慣れておくといいのではないでしょうか。

愛を分かち合いましょう