【python tips】長さの最大が固定されているリスト(collections モジュール)
長さを固定したリストに、要素を追加するとそれの中で一番古くに追加した要素を削除し、長さの最大数を固定してくれる機能をもつリストを紹介します。使うのは標準ライブラリにある、collections.deque です。
実際どんなものか
from collections import deque
# 最大3つ("maxlen=3")の要素を持てるリスト,list_aを生成
list_a = deque(maxlen=3)
# list_aに要素追加していき、どの様になるか見てみましょう
a_list.append(1) --> deque([1], maxlen=3)
a_list.append(2) --> deque([1,2], maxlen=3)
a_list.append(3) --> deque([1,2,3], maxlen=3)
a_list.append(4) --> deque([2,3,4], maxlen=3)
Pythonの標準ライブラリcollectionsモジュールのdequeを使います。dequeは通常のリストより先頭と末尾にある要素にアクセスしやすくすることに特化したものです。これに基づいたいくつかの便利な機能がありますが、今回は最大の要素数を設定できる事の紹介です。
dequeオブジェクトを生成する際、引数に"maxlen=整数" を定義する事によりリストの最大要素数を設定できます。そして上記の様に要素を一つづつ追加していき設定した最大数より要素数が多くなると [1,2,3] -> [2,3,4] の様に先に追加した"1"が削除され"4"が新たに追加されるので、リストが常に最新の設定数分の要素のものを保持されています。
リストとしての使い方
dequeオブジェクトは完全に通常のリスト(list)とは互換しませんので、その様には扱えません。なので、そうしたい場合はlist() などでキャストしてあげるといいでしょう。
a_list --> deque([2,3,4], maxlen=3)
a_list[1] --> 3
sum(a_list) --> 9
a_list[1:3] --> エラー(スライスなどリストでできる事でもできないことがある)
# リストにキャストする
new_a_list = list(a_list) --> listにキャストしてあげる
type(new_a_list) --> "list"になったのでいつものリストとして使える
# numpyのarrayに変える
a_array = numpy.array(a_list)
a_array --> array([2,3,4]