MENU

【Python】2次元リストを任意の値で初期化する方法

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を作成しています。

次に、rowscolsの数だけforループを回して、それぞれの要素に0を追加しています。

最後に、内側のforループが終わるたびに、rowリストをmatrixリストに追加しています。

内包表記を使った方法

内包表記を使って2次元リストを初期化する方法もあります。

内包表記は、リストを簡潔に生成するためのPythonの機能です。

以下のサンプルコードでは、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ループや内包表記を使った初期化方法を使用することが推奨されます。

forループや内包表記であれは、各行が異なるリストオブジェクトを参照するため、参照渡しの問題が発生しません。

そのため、特別な事情でもない限り、乗算演算子で2次元リストを作成・初期化しないようにしましょう。

1 2
目次から探す