人工知能や機械学習を実際に試してみようと思うとPythonやRといったプログラミング言語の習得が必要になりますよね。
そこで、KerasやTensorFlowといったディープラーニングのフレームワークでも使用されているPythonがあります。Pythonは、ソースコードを逐次実行するプログラミング言語で、読みやすく、簡潔なコードを書きやすい特長があり、比較的容易に習得できます。
そんなPythonのデータ構造には、リスト(list)、タプル(tuple)、辞書(dictionary)、集合(set)の4種類があります。データ構造とはデータを格納するための形式で、プログラムのアルゴリズムを実現するために重要な役割を果たすのだとか。そこで今回は、Pythonのデータ構造の中で最も基本的なリストについて解説します。
Pythonのリストとは
Pythonのリストは一般的には配列とも呼ばれるデータ構造で、複数のデータを格納することができる変数のこと。このリストに格納されるデータは要素と呼ばれます。各要素には、インデックスと呼ばれる番号が0から順番に割り振られ、リストから要素を指定して取り出すことができます。
それでは、具体的な例を見てみましょう。Pythonインタプリタの対話モードでリストxを宣言してみます。
このとき、リストxの一番の要素はx[0]、二番目の要素はx[1]、三番目の要素はx[2]といったように指定して取り出すことができます。
>>> x[1] 20
>>> x[2] 30
そして、Pythonのリストは変数であるため、要素の値を書き換えることもできます。
>>> x[2] = 3
>>> x[4] = 5
>>> x
[1, 20, 3, 40, 5]
また、Pythonのリストにはスライスという機能があり、リストの指定した範囲の要素が含まれる新しいリストを作ることができます。
新しいリストは
という形で作成します。
それではxのインデックス1から2までの要素を含むリストを作成しましょう。
尚、インデックスの開始位置の指定を省略した場合は最初から、終了位置の指定を省略した場合は最後までの要素が選ばれます。
Pythonのリストの種類
Pythonのデータ型には、整数のint型、浮動小数点のfloat型、文字列のstr型などがあります。先ほどの例のリストxの要素はint型でしたが、Pythonのリストはあらゆるデータ型を要素にとることができます。
また、一つのリストに複数のデータ型の要素を混在させることもできます。
更には、リストの中にリストを含めることもできます。これにより、多次元の配列を表現することができます。ここで、二次元配列を表すリストXを宣言しましょう。
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
このように、一次元配列のxと同様に、Xもインデックスを指定して要素を取り出すことができます。
リストの中に含まれているリストの要素も一度に取り出すことも可能です。一つ目のインデックスはリストXの要素を示し、二つ目のインデックスはリストXに含まれるリストの要素を示します。
>>> X[1][3] 9
三次元以上の配列の場合も同様に要素を取り出すことができます。
>>> Y[1][1][1] 11
Pythonのリストの使い方【基本編】
Pythonのリストには、リストを操作するための便利な機能であるメソッドがいくつか用意されています。リストの使い方の基本として、代表的なメソッドの使い方を紹介しましょう。
1つ目のメソッドはappend。appendを使用すると、リストの末尾に新たな要素を追加することができます。リストxに要素6を追加には、以下のようになります。
>>> x
[1, 2, 3, 4, 5, 6]
2つ目のメソッドはinsert。insertを使用すると、指定したインデックスの位置に要素を挿入することができます。リストxのインデックス2に要素3を挿入するには、以下のようになります。
>>> x
[1, 2, 3, 4, 5]
3つ目のメソッドはextend。extendは二つのリストを結合することができます。リストxにリストyを結合するには、以下のようになります。
>>> x
[1, 2, 3, 4, 5, 6, 7, 8]
最後に紹介するメソッドはsort。sortを使用するとリストを昇順に並び替えることができます。
>>> x
[1, 2, 3, 4, 5]
また、リストのメソッドではありませんが、sorted()という関数を使うと、リストを昇順に並び替えた新しいリストを取得できます。
>>> x
[3, 1, 2, 4, 5] >>> y
[1, 2, 3, 4, 5]
Pythonのリストの使い方【応用編】
「Pythonのリストとは」でリストを用いて二次元配列を扱えることをお伝えしました。そこで、リストの使い方【応用編】では二次元配列のリストをsortする方法を紹介しましょう。
Pythonではlambda式と呼ばれる名前を持たない無名関数を作ることができます。通常Pythonでは、以下のようにdefを用いて名前を決めて関数を定義します。
>>> return x + y
>>> add(1, 2)
3
ところが、lambda式を用いると以下のように名前を決めることなく、関数を使用することができます。
>>> add(1, 2)
3
このlambda式とsorted()を組み合わせることで、簡単に二次元配列の並び替えを行うことができるようになります。その場合は、リストXに含まれるリストのインデックス0が昇順になるように並び替えましょう。sorted()の引数keyにlambda式を指定します。これにより、sorted()はlambda式の結果に従って、並び替えを行います。
[[1, 20, 300], [2, 30, 100], [3, 10, 200]]
同様にリストXに含まれるリストのインデックス1、インデックス 2が昇順になるように並び替えましょう。
[[3, 10, 200], [1, 20, 300], [2, 30, 100]] >>> sorted(X, key=lambda x : x[2])
[[2, 30, 100], [3, 10, 200], [1, 20, 300]]
Pythonでリストを使う時の注意点
Pythonのリストを使うときの注意点として、リストのコピー方法を紹介します。リストxをコピーしてリストyを作ってみましょう。
ここで、xのインデックス1の値を変更してみます。
>>> x
[1, 20, 3, 4]
このとき、リストyの値はどうなるでしょうか。
[1, 20, 3, 4]
なんとリストxと同じように値が変わってしまっています。これは、値そのものではなく、参照が変数に代入されているからです。変数への代入でリストをコピーしたときに、参照がコピーされるので思わぬバグが発生してしまうことになるので注意しましょう。
参照ではなく、値をコピーしたい場合はcopyモジュールのcopyメソッドを使用します。copyメソッドを使用することで、リストxの値を変えてもリストyの値が書き換わることはありません。
>>> x = [1, 2, 3, 4] >>> y = copy.copy(x)
>>> x[1] = 20
>>> x
[1, 20, 3, 4] >>> y
[1, 2, 3, 4]
ただし、copyメソッドは浅いコピーと呼ばれ、多次元配列の要素となっているリストを値でコピーすることはできません。多次元配列を値でコピーしたい場合は、copyメソッドの代わりに深いコピーと呼ばれるdeepcopyメソッドを使用します。
さて、今回はPythonのリストについて解説しました。Pythonのリストについてお伝えした内容は以下のようなことです。
- Pythonのリストの要素とは、一般的には配列とも呼ばれるデータ構造で、複数のデータを格納することができる変数のこと
- Pythonのリストの要素には整数のint型、浮動小数点のfloat型、文字列のstr型などがある
- Pythonのリストの代表的なメソッドには、append,insert,extendがある
- Pythonでは、lambda式と呼ばれる名前を持たない無名関数を作ることができる
- Pythonのリストをコピーするときは、変数への代入でリストをコピーしたときに、参照がコピーされるのが注意
PythonはAI(人工知能)や機械学習のアルゴリズムを実装するために使われる最もポピュラーなプログラミング言語です。リストは大量のデータを処理する際に使用することも多いです。AI(人工知能)や機械学習の実践的な技術を身につけるには、Pythonのリストを習得することは重要でしょう。
参照元
Wikipedia──Python
Bill Lubanovic(2015)『入門 Python 3)』オライリー・ジャパン