プログラミング | オジサンテクノロジー

Python備忘録(配列)

掲載日:2019/07/21

概要

Pythonのプログラミングに関する備忘録をまとめました。
このページではリスト型・タプル型・辞書型とcollectionsモジュールについて紹介します。
他にセット型がありますが、とっつきにくいのでとりあえずここでは4つだけ紹介します。

1. リスト型

作成後、変更できる配列です。
ハードウェアでいうところのRAMです。
要素「1」と「a」と「あ」で作成する場合、下記のように記載します。
lTest = [1, 'a', 'あ']
要素数nのリストに対して、O記法による実行速度は下記の通りです。
・[]による要素の作成(上記例等):O(1)
・appendによる要素の追加(末尾に追加):O(1)
・insertによる要素の追加(任意の場所に追加):O(n)
・inによる要素の検索:O(n)

実行速度は、「まぁ。それくらいかかるよね。」という速度ですが、 検索容易性等を考慮し、要素の追加にinsertを使う場合、 要素の数によっては、collectionsモジュールのdequeを使った方が良いかもしれません。

また、要素が膨大にある場合、検索に時間がかかってしまうことはネックとなります。
そのようなケースでは、後述する辞書型を使ったほうが良いかもしれません。

2. タプル型

作成後、変更できない配列です。
ハードウェアでいうところのROMです。
要素「1」と「a」と「あ」で作成する場合、下記のように記載します。
tTest = (1, 'a', 'あ')
要素数nのリストに対して、O記法による実行速度はリストの場合と同じです。

一度作成した後は、サイズが変わらないため、メモリを節約できます。
「メモリとか言われても難しくてわかない」ケースもあると思いますが、 例えば数100Mバイトのデータを読み込むときにPCが異様に遅くなる等の現象はメモリ不足が原因です。
メモリを増設することで解決できる場合もありますが、 プログラミングの手法を変えるだけで解決できることもあります。
タプルを使うことはその方法のひとつです。

メモリ不足を回避するためには、ジェネレータを使うことなどのオーソドックスで効果のある手法がありますが、 リスト型をタプル型に変えるだけの方が簡単にはできると思います。

3. 辞書型

要素にキーワード(key)をつけることができる配列です。
作成後、変更もできます。
要素「1(key1)」と「a(key2)」と「あ(key3)」で作成する場合、下記のように記載します。
dTest = {key1: 1, key2: 'a', key3: 'あ'}
例えば、複数の変数を配列で管理したい場合には辞書型を用いると非常に便利です。
というか、辞書型を用いないと可読性の悪いソースコードが出来上がります。

また、keyを使うため、前述した通り、検索速度がリスト型よりも早くなります。(O(1))

一方で、下記の制約・デメリットもあるため、注意が必要です。
・keyの設定が必要
・keyが重複してはいけない
・要素の順番は保持されない
・リスト型と比べてkeyの分だけメモリが少し増える。

4. collectionsモジュール

最後にcollectionsモジュールについて紹介します。
collectionsモジュールを使うことで、機能が追加されたリスト型や辞書型を使用することができます。
ちなみに、このような処理を「継承」と言います。
例:collectionsモジュールのdefaultdictは辞書型のdictクラスを継承している。

4-1. リスト型の仲間

リスト型に機能を追加したdequeと、リスト型の要素に対してカウント処理を行うCounterを紹介します。

4-1-1. deque

リスト型と同じように使用することができます。
リスト型で末尾に要素を追加するappendに加えて、先頭に要素を追加するappendleftがあります。
appendleftの実行速度はO(1)なので、用途によっては実行速度の大幅な改善が可能です。
下記に使用例を示します。
def test_deque():
    lTest = [2, 3, 4]
    lDeque = deque(lTest)
    print(list(lDeque))
    lDeque.append(5)
    lDeque.appendleft(1)
    print(list(lDeque))
実行結果
[2, 3, 4]
[1, 2, 3, 4, 5]
また、rotateを用いると、appendleftの実行速度はO(1)なので、用途によっては実行速度の大幅な改善が可能です。
下記に使用例を示します。
def test_rotate():
    lTest = [1, 2, 3, 4, 5]
    lDeque = deque(lTest)
    print(list(lDeque))
    lDeque.rotate(2)
    print(list(lDeque))
実行結果
[1, 2, 3, 4, 5]
[4, 5, 1, 2, 3]

4-1-2. Counter

リスト型に対して、重複する要素の数をカウントし、辞書型で返します。

4-2. 辞書型の仲間

defaultdictとOrderedDictを紹介します。

4-2-1. defaultdict

keyが存在しない場合にデフォルト値を返すことができます。

4-2-2. OrderedDict

要素を挿入した順番を記録している辞書型です。