リスト(list)の基礎知識 – Python3 入門 マニュアル

このページではPython3のリスト(list)についての基礎知識から実用的な使い方まで、Python3のリスト操作に必要な知識をまとめています。

Python のリストは C / Java / PHP / Ruby / JavaScript 等、他のプログラミングの配列におよそ相当します。

リストの生成と要素の取得

リストの生成

リストの生成は角括弧 [  ] を使い、要素をコンマ区切りで記述します。文字列と数値のように異なる型の要素を混在することも可能です。

 

リストの要素として追加できるのは文字列や数値だけではありません。以下のようにリストの要素にリストをセットする、といったことも可能です。

 

要素の取得

要素はインデックスを指定して取得します。インデックスは 0 から始まります。インデックスにマイナスの値を指定すると、終端からn個目の要素を取得します。

 

複数要素の取得(スライス)

[ 開始位置 : 終了位置 ] によりリストの一部を(リストとして)取得できます。
 

[ 開始位置 : 終了位置 : ステップ数] によりステップ数を指定してスライスすることもできます。
 

要素数を取得

組み込み関数 len() によりリストの要素数を取得できます。

 

要素の追加・変更・削除

要素の追加

リストに要素を追加するには append() メソッドを使用します。append()メソッドはリストの最後に要素を追加します。

 

リストの任意の位置に要素を追加したい場合には insert() メソッドを使用します。insert() メソッドは list.insert(インデックス番号, 要素) のように使います。list.insert(0, 要素) とするとリストの先頭に要素を追加します。

 

要素の変更(置換)

インデックスを指定して再代入すると要素を変更(置換)できます。

 

スライスに代入することで、範囲を指定して要素を変更することもできます。

 

要素の削除

要素の削除は del 文またはpop()メソッドを使用します。

del 文はリストから特定の要素を削除します。インデックスだけでなく、スライスにより範囲を指定した削除もできます。

 

list.pop() メソッドはリスト中の指定された位置にある要素をリストから削除して、その要素を返します(return します)。インデクスが指定されなければ、リストの末尾の要素を削除して返します。

 

list.pop() メソッドは削除した要素を返しますが、del 文は何も返しません。b = del a[1] のように書くと構文エラーになります。

要素の全削除

リストの要素を全削除する場合には list.clear() メソッドを使用します。del list[:] のように del 文とスライスを組み合わせても要素を全削除できます。

 

要素を含むかの判定・検索

in 演算子を使用することで、リストに要素が含まれるかを判定できます。

 

存在の判定だけでなく検索結果のインデックスを取得したい場合は list.index() メソッドを使用します。ただし list.index() メソッドは取り扱いに注意が必要です。

list.index(x[, start[, end]])
リスト中で、値 x を持つ最初の要素の位置をゼロから始まる添字で返します。 該当する要素がなければ、ValueError を送出します。docs.python.jp より引用

該当する要素が複数ある場合には最初のインデックスを返すこと、該当する要素がない場合には ValueError になることに注意しましょう。ValueError でプログラムが止まらないようにするには例外処理(try … except … )が必要になります。

 

要素の並び替え(ソート)

リストの要素を並び替えるには list.sort() メソッドと組み込み関数 sorted() を使う2通りのやり方があります。

list.sort() メソッドによるソート

list.sort() メソッドはリストオブジェクト自体を書き換えてしまう「破壊的メソッド」であることに注意しましょう。

sorted() 関数によるソート

sorted() を使うとソート元となるリストをインプレースすることなく、並び替えることができます。

 

リスト演算子 – 結合など

変数aと変数bを以下とします。

 

演算子 説明とサンプル
+ リストを結合します。

print(a + b) # [1, 2, 3, 1, 3, 5, 7, 9]

*  リストをn回結合します。

print(a * 3) # [1, 2, 3, 1, 2, 3, 1, 2, 3]

in  リストに要素が含まれるかを判定します。含むならTrue、含まないならFalseを返します。

print(2 in a) # True
print(10 in a) # False
print(‘str’ in a) # False

not in  in の逆、つまりリストに要素が含まないかを判定します。含むならFalse、含まないならTrueを返します。

print(2 not in a) # False
print(10 not in a) # True
print(‘str’ not in a) # True

[i]  0 から数えて i 番目の要素を取得します。

print(a[0]) # 1
print(a[1]) # 2

[i:j] i から j までのスライス。複数要素の取得(スライス)を参照。

print(b[1:4]) # [3, 5, 7]

[i:j:k]  i から j まで、 k 毎のスライス。複数要素の取得(スライス)を参照。

print(b[0:5:2]) # [1, 5, 9]

 

リストのループ処理(for ループ)

リストのループ処理には for 文を使います。

 

要素番号(インデックス)をあわせて取得したい場合は、組み込み関数 enumerate() を使います。

 

リストの代入とコピーに関する注意点(重要)

下記サンプルコードの print(a) 結果はどうなるでしょうか?

答えは以下となります。変数 a の要素も連動して変更されることに注意しましょう。

 

これは Python3 公式ドキュメントの浅いコピーおよび深いコピー操作にあるように、リストの代入文はオブジェクトをコピーせず参照渡しするためです。

a と b の要素を連動せず独立にしたい場合には、list.copy() メソッドによりコピー(浅いコピー)します。

 

リストのスライスを使ってコピーすることもできます。

リストのスライスが(浅い)コピーを返すことを利用した Python3 必須のテクニックなので、覚えておきましょう。

全てのスライス操作は指定された要素を含む新しいリストを返します。これは、次のスライスはリストの新しい (浅い) コピーを返すことを意味します:
docs.python.jp より引用

スライスによるコピーは特定のキーワードがないためGoogleで検索するのが難しく、知っている人にしか読めません。共同作業の場合には可読性の点から copy() メソッドの方が良いでしょう。

 

リストの内包表記(重要)

Python のリストには他のプログラミング言語の配列にはない「リスト内包表記( List Comprehensions )」というリスト生成のための表記法があります。リストの内包表記を使うと、煩雑なリスト生成を簡潔に記述できる(こともある)ため、Pythonではよく利用されます。

たとえば list.append() ならGoogleで簡単に検索できるでしょう。しかし、内包表記は角括弧 [ ] 、 for、in で記述され、特定の検索キーワードがなく、調べようがありません。必ず頭に入れておきましょう。

リスト内包表記のサンプル

sources = [1, 2, 3, 4, 5] というリストについて、各要素の値を2乗したリスト squares を生成するにはどうすればよいでしょうか。

下記のような解をパッと思いつくでしょう。

 

リストの内包表記を使うと、下記のように簡潔に記述することができます。

 

内包表記は if 文を使用することもできます。

sources = [1, 2, 3, 4, 5] というリストについて、偶数の要素のみを取り出して値を2乗したリスト squares を生成するにはどうすればよいでしょうか。

 

リストの内包表記を使うと、下記のように1行で簡潔にすることができます。

 

ここでは2乗しましたが、単純に偶数のみを取り出してリストを生成するなら以下のようになります。

 

リスト内包表記はネストすることもできたりと非常に強力です。詳細は公式ドキュメントの「リストの内包表記( List Comprehensions )」を参照ください。

過剰な内包表記は、あなた以外の開発メンバーにとって意味不明な記述になります。複雑な場合には冗長でも for文等により記述しましょう。

 

リストとタプルの変換

リストとタプルは変換可能です。

リストをタプルに変換するには組み込み関数 tuple() を使用します。

 

タプルをリストに変換するには組み込み関数 list() を使用します。