Pythonで2次元リストを作成・操作する方法(リストのリスト)
生徒
「Pythonで表みたいなデータを扱いたいんですけど、どうすればいいですか?」
先生
「それなら『2次元リスト』がぴったりだね。リストの中に、さらにリストを入れることで、表のようなデータ構造を作れるよ。」
生徒
「へえ!1つのリストの中に、さらにリストを入れるんですね!」
先生
「そう。リストのリストとも呼ばれるよ。使い方を一緒に学んでいこう!」
1. 2次元リストとは?
Pythonの2次元リストとは、「リストの中にリストが入っている構造」のことです。言い換えると、表やマトリックスのように行と列を持つデータを扱えるようになります。
例えば、次のように3行3列の数字を持つ表を作ることができます。
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
このように、外側のリストの中に、3つの内側のリストがあり、それぞれが「1行」を表しています。
2. 要素にアクセスするには?
2次元リストの要素にアクセスするときは、[行番号][列番号]のように2つの角カッコを使います。行番号と列番号はどちらも0から始まります。
print(matrix[0][1]) # 1行目・2列目の値
2
この例では、1行目(index=0)の2番目(index=1)の値「2」を取り出しています。
3. 2次元リストを作る方法
2次元リストは、最初からすべての要素を手入力して作ってもいいですが、数が多いと大変です。その場合、for文を使って自動で作成することができます。
rows = 3
cols = 4
matrix = []
for i in range(rows):
row = [0] * cols
matrix.append(row)
print(matrix)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
この例では、3行4列のすべての値が「0」の表を作っています。
4. 2次元リストの中身を1つずつ表示する
2次元リストのすべての値を1つずつ表示するには、入れ子になったfor文を使います。
for row in matrix:
for val in row:
print(val, end=" ")
print()
0 0 0 0
0 0 0 0
0 0 0 0
end=" "は、1行で横に並べるための指定です。print()は改行のために使っています。
5. 特定の位置の値を変更する
2次元リストの特定の位置にある値を変更したいときは、指定して代入します。
matrix[1][2] = 99
print(matrix[1])
[4, 5, 99, 6]
このように、「2行目・3列目」の値を99に変更しています。インデックスは0から始まるので注意してください。
6. 2次元リストを使う場面って?
2次元リストは、以下のような場面でよく使われます:
- 表形式のデータ(成績表、商品リストなど)
- 画像データの画素(ピクセル)情報
- マップ情報(ゲームなどの座標データ)
- 計算用マトリックス(数学、データ分析)
Pythonでデータを管理したり処理したりする上で、2次元リストはとても基本的で重要なテクニックです。
7. 応用:表を初期値つきで作る
次は、指定した値で表全体を埋める2次元リストを作ってみましょう。
rows = 2
cols = 3
matrix = [[1 for _ in range(cols)] for _ in range(rows)]
print(matrix)
[[1, 1, 1], [1, 1, 1]]
このように「内包表記」という書き方を使えば、短く書くこともできます。最初は無理に覚えなくてもOKですが、知っておくと便利です。
8. インデックスのエラーに注意
Pythonで2次元リストを使っていて、よくある失敗が「インデックスエラー」です。
たとえば、存在しない行や列を指定すると、エラーが発生します。
print(matrix[10][0]) # エラーになります
IndexError: list index out of range
このエラーは、「リストの範囲外の番号を使ったよ」という意味です。インデックスは必ず範囲内で指定しましょう。
まとめ
Pythonで2次元リストを扱うということは、単に「リストの中にリストが入っている」という構造を覚えるだけではなく、表形式のデータや行列のような構造化された情報を自在に操作できるようになるということです。2次元リストという考え方に慣れておくと、成績表や商品一覧のような表、座標を扱う地図やゲームのマップ、数学で使う行列や統計データなど、さまざまな場面で柔軟にデータを整理して扱えるようになります。外側のリストが「行」の集まりで、内側のリストが「1行分の要素」であるというイメージをしっかり持っておくと、行番号と列番号で要素にアクセスする基本的な仕組みが自然に理解できるようになります。
2次元リストの要素にアクセスするときには、行を示すインデックスと列を示すインデックスを順番に指定していきます。たとえばmatrix[0][1]のように書くことで「0行目の1列目」という位置の値を取り出すことができます。これは現実の表で「上から何行目」「左から何列目」と指差している感覚に近く、慣れてくると非常に直感的です。逆にインデックスの指定を間違えると、意図しない値を参照してしまったり、存在しない行や列を指定してIndexErrorが発生したりするので、行の数と列の数を常に意識しておくことが大切です。プログラムの途中で長さを確認したり、範囲チェックを行う癖を付けることで、こうしたエラーはかなり防ぐことができます。
また、2次元リストを作成するときの考え方もとても重要です。すべての行と列を手で書き並べる方法は、小さな表であればわかりやすい反面、行数や列数が増えるとすぐに限界がきてしまいます。そのようなときには、ループを使って初期値をまとめて埋める方法が役に立ちます。外側のfor文で行を繰り返し、内側で列の数だけ値を並べることで、規則的な2次元リストを自動的に用意できます。さらに、内包表記を利用すると、同じ処理をよりコンパクトに記述できるため、コードを短く保ちながら読みやすさも維持できます。最初は少し不思議に感じるかもしれませんが、実際に書いてみると便利さがよく分かります。
2次元リストを使いこなすためには、作成・アクセス・更新・走査という四つの基本操作をひととおり練習しておくことがとても効果的です。まずは小さな表を自分で作り、特定の位置の値を書き換えたり、入れ子のfor文で全体を表示したりしてみましょう。そこで慣れてきたら、行ごとに合計を計算したり、特定の値だけを探したり、条件を満たす要素を数えたりといった処理に挑戦してみるのがおすすめです。2次元リストのしくみが理解できると、Pythonで扱えるデータの表現力が大きく広がり、より実践的で役に立つプログラムを書けるようになります。
サンプルプログラムで2次元リストを復習しよう
下のサンプルでは、2次元リストを作成して中身を表示し、特定の位置の値を書き換え、最後に各行の合計を計算しています。2次元リストの基本操作をひととおり確認できる例になっています。
# 3行4列の2次元リストを0で初期化する
rows = 3
cols = 4
matrix = []
for i in range(rows):
row = [0] * cols
matrix.append(row)
print("初期状態の2次元リスト:")
for row in matrix:
print(row)
# 特定の位置の値を変更する
matrix[0][1] = 10
matrix[1][2] = 20
matrix[2][3] = 30
print("値を変更したあとの2次元リスト:")
for row in matrix:
print(row)
# 各行の合計を計算する
print("各行の合計:")
for i, row in enumerate(matrix):
total = sum(row)
print(f"{i}行目の合計:", total)
このサンプルでは、まず0で埋めた3行4列の2次元リストを作成し、その後いくつかの要素を別の値に書き換えています。最後に、各行の合計を計算して表示することで、「表の横一列をまとめて処理する」という考え方を体験できます。実際の場面では、成績表の点数を合計したり、在庫数や売上数を集計したりといった処理に応用できます。こうした練習を通して、2次元リストというデータ構造がより身近で扱いやすいものになっていきます。
生徒
「きょうは2次元リストについて学びましたが、最初は少し難しそうだと思っていました。でも、外側が行で内側が列というイメージで考えると、だんだん表のように頭の中で整理できるようになってきました。インデックスが0から始まることも含めて、行番号と列番号をきちんと意識しておけば、どの位置の値を取り出しているのかが分かりやすかったです。」
先生
「その感覚はとても大切ですね。2次元リストは、単なる入れ子のリストではなく、行と列を持つ表として考えると理解しやすくなります。実際の表と同じように、上から何行目か、左から何列目かを意識しながらコードを書いていくと、ミスも減っていきますよ。特にインデックスの範囲外を指定してしまうとIndexErrorが出るので、行数や列数の確認を忘れないようにしましょう。」
生徒
「入れ子のfor文を使って2次元リストの中身を一つずつ表示するところも、とても勉強になりました。最初はfor row in matrixとfor val in rowのように二重で回すのがややこしく感じたのですが、行を取り出してから、その中の値を順番に取り出すという考え方で見ると、仕組みがよく分かりました。表を横に並べて表示したり、特定の条件に合う値だけを探したりする処理にも応用できそうです。」
先生
「入れ子のループは最初のハードルになりがちですが、一度感覚をつかむとさまざまな場面で役に立ちます。2次元リストの各行を順番に見て、その中の要素も順番に処理するという流れを押さえれば、合計を出したり、最大値や最小値を探したり、条件を満たす要素の個数を数えたりといった処理も自然に書けるようになります。たとえばゲームのマップや座標の情報を2次元リストに入れておいて、特定の記号だけを探すといった仕組みも実装できますよ。」
生徒
「行数と列数を変えながら、自分でもいろいろな2次元リストを作って試してみたいと思います。内包表記を使って表を一気に作る方法も、最初は少し不思議でしたが、慣れてくるととても短く書けるので気持ちよかったです。今後は、成績表みたいなデータや、簡単なマップデータなども2次元リストで表現してみて、どんな処理が書けるのか試してみたいです。」
先生
「すばらしいですね。実際に手を動かして2次元リストを作り、値を変えたり、集計したりしていくうちに、Pythonで表形式のデータを扱う力がどんどん身についていきます。小さな例から少しずつステップアップしていけば、より複雑なデータ構造やライブラリにもスムーズに進んでいけますよ。これからも、2次元リストを土台にして、さまざまなデータの表現や処理方法に挑戦していきましょう。」