Pythonのリスト型の使い方まとめ

他の言語でいうと配列にあたるPythonのリスト型の使い方を説明します

リスト型

他の言語でいうところの配列となるのがリスト型です。

リスト型は複数のデータが整理された表をイメージするとわかりやすいかと思います。

例えば学校で勉強している各科目のテスト点数の一覧かもしれません。

またはテスト点数ではなくて各科目の成績一覧かもしれません。

はたまた、学校の生徒名簿一覧かもしれません。

このような複数ある同じ種類のデータをまとめて扱うときはリストを使います。

リストで扱うデータは数値や文字列などPythonで扱うデータは全て扱えます。

リストの定義方法

複数のデータをカンマ(,)で区切って、それらを角括弧([ ])で囲みます。

角括弧に含まれている複数のデータそれぞれを要素と呼びます。

[要素0, 要素1, 要素2, ...]

一番左の要素は「要素0」と書いてますが、リストの中の要素にはインデックスという番号が割り振られています。

インデックスは左から順に「0, 1, 2, …」となります。

例えば変数に以下のようなリストが代入されていた場合、

>>> eigo = ['a', 'b', 'c']

一番左の要素を取り出すにはインデックス0を指定します。

記述方法は、

リスト名[インデックス]

となるので上のリストの一番左の要素は、

>>> eigo[0]

で取り出すことができます。

リストの使い方

上記では要素を取り出す基本的な方法を説明してます。

もう少し要素の数を増やして、

>>> eigo = ['a', 'b', 'c', 'd', 'e', 'f']

このリストを使ってみましょう。

今度は3番目の要素を取り出して変数に代入してみましょう。

>>> char = eigo[2]

これで変数charには「c」が代入されます。

インデックスは右から順に割り当てを指定することもできます。

その場合は右から順に「-1, -2, -3, …」となります。

インデックスをマイナス符号付きの番号で参照すると右から参照することになります。

上のリストで一番右の要素を取り出して変数に代入してみましょう。

>>> char = eigo[-1]

これで変数charには「f」が代入されます。

リストの要素数が多くてインデックスがわからなくても最後(一番右)の要素はこうやって参照できます。

これはeigo[len(eigo)-1]と同じです。

len()組込み関数はリストの長さを返します。

また複数の要素をスライス操作でリスト型で取り出すこともできます。

>>> chars = eigo[1:4]

これはeigo[1]からeigo[3]までの要素を取り出して変数charsにリスト型で代入します。

>>> chars
['b', 'c', 'd']

スライス操作は、

[最初のインデックス:最後のインデックス+1]

となります。

最後のインデックスは取り出したい要素のインデックスに+1する必要があるので気をつけてください。

最初のインデックスだけを指定するとそのインデックスからリストの最後までを取り出します。

>>> chars = eigo[3:]
>>> chars
['d', 'e', 'f']

最後のインデックスだけを指定するとそのインデックスからリストの最初までを取り出します。

>>> chars = eigo[:4]
>>> chars
['a', 'b', 'c', 'd']

リストの要素を変更することもできます。

>>> chars[3] = 'z'
>>> chars
['a', 'b', 'c', 'z']

リストはプラス(+)演算子を使ってリストを連結することもできます。

>>> chars = eigo+ ['g', 'h', 'i']
>>> chars
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

またリストは要素を削除することもできます。

削除するときはdel文を使います。

>>> del chars[3]
>>> chars
['a', 'b', 'c', 'e', 'f', 'g', 'h', 'i']

このときリスト内は前詰めされるので、インデックス3番目から最後までの要素のインデックスが変更されます。

つまり削除前にインデックス4番目にあった要素は、削除後インデックス3番目に変わります。

同じようにそこから最後の要素までインデックスは変更されます。

なので削除後にそのインデックスに要素を入れると、要素が変更されます。

>>> chars[3] = 'd'
>>> chars
['a', 'b', 'c', 'd', 'f', 'g', 'h', 'i']

要素の変更や削除はスライス操作を使うこともできます。

>>> chars[0:2] = ['Hello', 'World']
>>> chars
['Hello', 'World', 'c', 'd', 'f', 'g', 'h', 'i']

リストに要素を挿入するには、insert()メソッドを使います。

リストにはいくつかメソッドがあり、insert()もその1つです。

>>> chars.insert(4, 'e')
>>> chars
['Hello', 'World', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

リストは要素の追加や変更を自由にできるので可変である「ミュータブル」といいます。
リスト以外にも要素の変更ができる型はミュータブルです。
その反対にタプルのような要素が変更できない型を「イミュータブル」といいます。

メソッドを使うとリストにいろいろな操作ができます。

append()メソッドで要素を追加することができます。

>>> eigo.append('j')
>>> eigo
['a', 'b', 'c', 'd', 'f', 'g', 'h', 'i', 'j']

このメソッドはリストの最後に指定の要素を追加します。

これはeigo[len(eigo):] = ['j']と同じです。

extend()メソッドでリストどうしを連結することができます。

>>> ext = ['k', 'l', 'm']
>>> eigo.extend(ext)
>>> eigo
['a', 'b', 'c', 'd', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm']

上記で説明したプラス(+)演算子と同じ動作です。

remove()メソッドで要素を削除することができます。

>>> eigo.remove('h')
>>> eigo
['a', 'b', 'c', 'd', 'f', 'g', 'i', 'j', 'k', 'l', 'm']

remove()で削除する場合は引数に削除したい要素を指定します。

同じ要素が複数あった場合はリストの先頭(左)から検索し最初に見つかった要素を削除します。

pop()メソッドで指定位置の要素を削除し、その要素を返します。

>>> char = eigo.pop()
>>> eigo
['a', 'b', 'c', 'd', 'f', 'g', 'i', 'j', 'k', 'l']
>>> char
'm'

pop()の引数に何も指定しないときはリストの最後の要素が削除され、戻り値として返されます。

引数にインデックスを指定するとそのインデックスの要素が削除され、戻り値として返されます。

>>> char = eigo.pop(3)
>>> char
'd'

clear()メソッドでリストの全ての要素を削除します。

>>> eigo.clear()
>>> eigo
[]

これはdel eigo[:]eigo[:] = []と同じ動作です。

index()メソッドは引数で指定したものと同じ要素がリストにあれば、そのインデックスを戻り値として返します。

>>> eigo = ['a', 'b', 'c', 'a', 'b', 'c']
>>> eigo.index('c')
2

index()の引数に検索範囲を指定することもできます。

>>> eigo.index('c', 3, 6)
5

検索範囲の指定は第2引数が開始、第3引数が終了で、スライス操作と同じ解釈となります。

count()メソッドは引数に指定した要素と同じものの出現回数を戻り値として返します。

>>> eigo.count('b')
2

sort()メソッドはリストを挿入ソートで並び替えます。

>>> eigo.sort()
>>> eigo
['a', 'a', 'b', 'b', 'c', 'c']

引数に何も指定しない場合は昇順で並び替えます。

降順で並び替えるときは、

>>> eigo.sort(reverse=True)
>>> eigo
['c', 'c', 'b', 'b', 'a', 'a']

とします。

reverse()メソッドを使うとリストの要素を逆に並び替えます。

>>> eigo.reverse()
>>> eigo
['a', 'a', 'b', 'b', 'c', 'c']

copy()メソッドを使うとリストを複製します。

>>> words = eigo.copy()
>>> words
['a', 'a', 'b', 'b', 'c', 'c']

これはeigo[:]と同じです。

リストの基本的な使い方は以上です。

そして、このリストを使って様々な処理ができます。

リストの利用例

よく見るものを少し紹介しましょう。

リストでまとめた情報を可視化するためにグラフ表示をするのが多いと思います。

例えば7日間の気温の変化をグラフにすると以下のようになります。

Pythonでグラフ表示するのによく使われるライブラリがMatplotlibです。

するのによく使われるライブラリがMatplotlibです。

Matplotlibを使うとこのようなグラフが簡単に表示できます。

このグラフのリストは以下のようになります。

temps = [30.5, 29.1, 30.2, 30.1, 30.4, 29.5, 29.3]

それからリストを使ったスタック処理もよく見ます。

スタックとは、後入れ先出しLIFO(Last in First out)でデータを処理します。

出典:wikipedia

履歴を扱うような処理をするときに使います。

例えば、Webページ遷移のように読み進んだところから後に戻るときは、単純な戻る操作は最新の閲覧履歴から順に戻っていきます。

このとき読むときに履歴情報がプッシュされて、戻って閲覧するときにポップされます。

Pythonのリストを使うと以下のようになります。

>>> stack = [1,2,3]
>>> stack.append(4)
>>> stack.append(5)
>>> stack
[1, 2, 3, 4, 5]
>>> stack.pop()
5
>>> stack.pop()
4
>>> stack
[1, 2, 3]

そしてリストを使ったキュー処理もよく見ます。

キューとは、先入れ先出しFIFO(First in First out)でデータを処理します。

出典:wikipedia

順番待ちが必要な処理をするときに使います。

例えば、プロセスやスレッド間の非同期処理やプリンタ出力のような非同期処理でよく見ます。

こういったものは先に順番待ちしているものから処理していきます。

Pythonのリストを使うと以下のようになります。

>>> queue = [1,2,3]
>>> queue.append(4)
>>> queue.append(5)
>>> queue
[1, 2, 3, 4, 5]
>>> queue.pop(0)
1
>>> queue.pop(0)
2
>>> queue
[3, 4, 5]

最後に

Pythonでリストを使えるようになるといろいろな処理ができるようになります。

他の言語と同じようにPythonでコーディングされたものも、ほぼ必ずリストは使われています。

またリストは繰り返し文とセットで登場することが多いです。

Pythonの場合、短いfor文は内包表記といってリスト構造([])の中にfor文を直接書くことができます。

そうすることでリストを初期化するような短いfor文は冗長的にならず、まとめて記述することができます。

いろんな処理に役立つリスト型をどんどん使っていきましょう。