Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
今回はPythonに最初からついている便利なcollectionsモジュールが提供するdeque(デックと呼びます)という特殊なコンテナ型の使い方の説明です。
Contents
Python公式ドキュメント:class collections.deque([iterable[, maxlen]])
まずそもそも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、2、3に順番に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行が返されるというわけです。
上のコードで作られたdeqそしてdeq_2はdeque型オブジェクトです。deque型オブジェクトは、
などなど多くの便利なメソッドが用意されています。
これらについて1つずつ解説するのは省きます。Python公式ドキュメント:class collections.deque([iterable[, maxlen]])をご覧ください。
さてこのようなdeuqですが、普通にPython標準のlistを使ってもdeque型が実現する機能と同じ機能を実装することは可能です。しかしPythonに最初から用意されているlistなどと比べると、
などのメリットがあると説明されています。
しかし、一方で上述のような両端以外の要素の処理は遅いというデメリットもあるとされています。もちろんちょっとした小さなプログラムでしたらlistだろうとdequeだろうと現実的に問題となるようなレベルの差はないかもしれません。
またdequeのメソッドにはsortが用意されていません。つまり要素を自由に入れ替えることは基本的にできないわけです。
上のメリット・デメリットを考えると、個人でちょっとしたプログラムを組む程度の場合ならば、listとの使い分けについてはだいたいにおいて以下のようにすればいいのではないでしょうか。
以上、簡単にではありますがcollectionsモジュールのdequeの使い方の解説でした。このようにcollectionsモジュールには便利なデータ型やメソッドが用意されていますので、普段からcollectionsモジュールの使い方に慣れておくといいのではないでしょうか。