前回紹介した「タプル」とよく似たPythonのリスト。

タプルは一度定義すると、後から内容を差し替えることができないので主に定数的な使い方をする。

リストは可変長なデータ構造なので、後からあらゆるデータ操作を行うことができる。

今回はこの「リスト」について詳しく解説していこう。

リストの定義

リストの定義は他のプログラミング同様、角括弧を使う方法とlist関数を使う方法がある。

list_a = [1, 2, 3]

tuple_1 = 4, 5, 6
list_b = list(tuple_1)

リストの参照はタプルと同様、インデックス番号を指定して行う。

list_a = [1, 2, 3]
list_a[1] # 2

リストに要素を追加・削除

appendメソッドを使うとリストの末尾に要素を追加することができる。

list_a = [1, 2, 3]
list_a.append(4) # [1, 2, 3, 4]

insertメソッドは第一引数に指定した位置に要素を追加できる。

list_a = [1, 2, 3]
list_a.insert(0, 4) # [4, 1, 2, 3]
list_a.insert(2, 5) # [4, 1, 5, 2, 3]

popメソッドはinsertと全く逆の処理を行う。
指定したインデックス番号の位置にある要素を削除する。

list_b = list('string') # ['s', 't', 'r', 'i', 'n', 'g']
list_b.pop(2) #['s', 't', 'i', 'n', 'g']

removeメソッドも要素を削除することができるが、こちらは指定した値を最初から検索し、リスト内で最初に見つかったものを削除する。

list_b = list('string') # ['s', 't', 'r', 'i', 'n', 'g']
list_b.remove('t') # ['s', 'r', 'i', 'n', 'g']

リストの連結

タプルと同様、+演算子を使うと複数のリストを連結することができる。

list_a = [1, 2, 3] + [4, 5, 6] # [1, 2, 3, 4, 5, 6]

また、extendメソッドを使うと既に定義されたリストに、引数で指定したリストを追加できる。

list_a = [1, 2, 3] + [4, 5, 6]
list_a.extend([7, 8, 9]) # [1, 2, 3, 4, 5, 6, 7, 8, 9]

上記のとおり二つの連結方法があるが、処理の速さはextendメソッドの方が早いようなので積極的に利用するようにしよう。

リストのソート

sort関数を使うとリスト内の要素をソート(並び替え)することができる。

list_a = [7, 1, 3, 9, 5]
list_a.sort() # [1, 3, 5, 7, 9]
list_a.sort(reverse=True) # [9, 7, 5, 3, 1]

list_b = ['aa', 'bbbb', 'c', 'ddd']
list_b.sort(key=len) # ['c', 'aa', 'ddd', 'bbbb']

デフォルトでは昇順ソートが行われるが、reverse引数にTrueを指定すると降順ソートを行うことができる。

また、key引数にソートの際の基準となるキーを指定することもできる。
サンプルのコードではkeyにlenを指定している。
これは各要素の文字数をベースに昇順ソートをする。

スライシング

リストから一部を抽出する場合は、スライスと呼ばれる記法を使う。
[start:stop]形式でインデックス番号を指定する。

list_a = [7, 1, 3, 9, 5, 2, 8]
list_a[2:3] # [3]
list_a[0:2] # [7, 1]
list_a[:3] # [7, 1, 3]
list_a[3:] # [9, 5, 2, 8]
list_a[-2:-1]
list_a[-1:] # [8]

コロンを二つ続けるとstep指定をすることもできる。
例えば2を指定すると一つ飛ばしで要素を取得する。

list_a = [7, 1, 3, 9, 5, 2, 8]
list_a[::2] # [7, 3, 5, 8]

また、スライスに対して要素を代入することもできる。

list_a = [7, 1, 3, 9, 5, 2, 8]
list_a[2:5] = [1, 2, 3]
list_a # [7, 1, 1, 2, 3, 2, 8]

リストタプルの使い分け

タプルは先述のとおり定数的なデータ構造なので、使える機能が限られる。

対してリストは可変長なデータ構造なので扱いやすい反面、使える機能も幅広い。

一度に全部覚えようとすると大変なので、こんな使い方、メソッドもある、というくらいに理解し、必要に応じて引き出しを開けるようにすると良いだろう。