2次元リストは、リストの中にリストが入っているデータ構造で、表や行列などのデータを扱う際に便利です。
この記事では、プログラミング初心者にもわかりやすく、2次元リストの初期化方法を詳しく解説します。
forループを使った初期化
2次元リストを初期化する方法の一つとして、forループを使った方法があります。
この方法では、まず外側のリストを作成し、その後内側のリストを追加していくことで2次元リストを構築します。
ネストしたforループ
ネストしたforループを使って2次元リストを初期化する方法を見ていきましょう。
以下のサンプルコードでは、3行4列の2次元リストを作成しています。
rows = 3
cols = 4
matrix = []
for i in range(rows):
row = []
for j in range(cols):
row.append(0)
matrix.append(row)
print(matrix)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
このコードでは、まず空のリストmatrix
を作成しています。
次に、rows
とcols
の数だけforループを回して、それぞれの要素に0を追加しています。
最後に、内側のforループが終わるたびに、row
リストをmatrix
リストに追加しています。
内包表記を使った方法
内包表記を使って2次元リストを初期化する方法もあります。
以下のサンプルコードでは、3行4列の2次元リストを作成しています。
rows = 3
cols = 4
matrix = [[0 for j in range(cols)] for i in range(rows)]
print(matrix)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
このコードでは、内側のリスト内包表記[0 for j in range(cols)]
で、cols
の数だけ0を持つリストを作成しています。
その後、外側のリスト内包表記for i in range(rows)
で、rows
の数だけ内側のリストを繰り返しています。
内包表記を使うことで、コードが短くなり、読みやすくなります。
ただし、リスト内包表記は初心者には少し難しい概念なので、まずはネストしたforループを使った方法を理解してから、内包表記を使った方法に挑戦してみてください。
リストの乗算を使った初期化
リストの乗算を使って2次元リストを初期化する方法もあります。
リストの乗算とは、リストを指定した回数繰り返すことです。
例えば、[0] * 3
とすると、[0, 0, 0]
というリストが作成されます。
これを利用して2次元リストを初期化してみましょう。
rows = 3
cols = 4
matrix = [[0] * cols] * rows
print(matrix)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
この方法で、3行4列の2次元リストが初期化されました。
しかし、この方法には注意点があります。
乗算を使った方法の注意点
リストの乗算を使った初期化方法は、簡単に2次元リストを作成できる反面、参照渡しという問題があります。
これにより、一部の要素を変更すると、他の要素も変更されてしまうことがあります。
以下の例を見てみましょう。
rows = 3
cols = 4
matrix = [[0] * cols] * rows
matrix[0][0] = 1
print(matrix)
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
matrix[0][0]
の値を変更しただけなのに、他の行の同じ列の値も変更されてしまいました。
これは、リストの乗算を使った初期化方法では、すべての行が同じリストオブジェクトを参照しているためです。
forループや内包表記であれは、各行が異なるリストオブジェクトを参照するため、参照渡しの問題が発生しません。
そのため、特別な事情でもない限り、乗算演算子で2次元リストを作成・初期化しないようにしましょう。