「表のようなデータをpythonで扱いたい」
「リストの中にリスト?どうやって使うの?」
今回は2次元リストについて、初心者の方でも理解できるように詳しく説明していきます。
2次元リストとは?「表」のようなデータ構造

2次元リストとは、「リストの中にリストが入っている構造」のことです。
普通のリスト(1次元)が「横一列のデータ」だとすると、2次元リストは「行と列を持つ表」のようなイメージです。
具体例で理解しよう
# 普通のリスト(1次元)
numbers = [1, 2, 3, 4, 5]
# 2次元リスト
matrix = [
[1, 2, 3], # 1行目
[4, 5, 6], # 2行目
[7, 8, 9] # 3行目
]
このmatrix
は、3行3列の表のようなデータです:
1 2 3
4 5 6
7 8 9
実際の例:成績表
# 学生の成績表(名前、数学、英語、国語)
scores = [
["太郎", 85, 78, 92],
["花子", 92, 88, 85],
["次郎", 78, 85, 90]
]
このように、表形式のデータを簡単に表現できます。
2次元リストの要素にアクセスする方法
2次元リストの要素にアクセスするには、[行番号][列番号]という形式を使います。
matrix = [
[1, 2, 3], # 0行目
[4, 5, 6], # 1行目
[7, 8, 9] # 2行目
]
# 0 1 2 ← 列番号
# 特定の要素にアクセス
print(matrix[0][0]) # 1 (0行目、0列目)
print(matrix[0][1]) # 2 (0行目、1列目)
print(matrix[1][2]) # 6 (1行目、2列目)
print(matrix[2][0]) # 7 (2行目、0列目)
行全体を取得する
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 1行目全体を取得
first_row = matrix[0]
print(first_row) # [1, 2, 3]
# 2行目全体を取得
second_row = matrix[1]
print(second_row) # [4, 5, 6]
要素を変更する
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 1行目の2列目を変更
matrix[0][1] = 99
print(matrix) # [[1, 99, 3], [4, 5, 6], [7, 8, 9]]
# 2行目全体を変更
matrix[1] = [10, 11, 12]
print(matrix) # [[1, 99, 3], [10, 11, 12], [7, 8, 9]]
2次元リストの作成方法

直接作成する
# 直接値を入力して作成
data = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
空の2次元リストを作成する
# 3行3列の空の2次元リスト(すべて0で初期化)
matrix = [[0 for _ in range(3)] for _ in range(3)]
print(matrix) # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
# より簡潔な書き方
matrix = [[0] * 3 for _ in range(3)]
print(matrix) # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
異なる値で初期化する
# 5行4列のリストを作成(すべて空文字で初期化)
table = [[""] * 4 for _ in range(5)]
# ユーザー入力で値を設定
for i in range(3):
row = []
for j in range(3):
value = int(input(f"{i+1}行目{j+1}列目の値を入力: "))
row.append(value)
table.append(row)
よくある間違いと注意点

間違った2次元リストの作り方
# 間違い:この書き方はダメ
wrong_matrix = [[0] * 3] * 3
print(wrong_matrix) # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
# 一見正しく見えるが...
wrong_matrix[0][0] = 1
print(wrong_matrix) # [[1, 0, 0], [1, 0, 0], [1, 0, 0]]
# すべての行が同じオブジェクトなので、全部変更されてしまう
正しい作り方
# 正しい:リスト内包表記を使う
correct_matrix = [[0] * 3 for _ in range(3)]
correct_matrix[0][0] = 1
print(correct_matrix) # [[1, 0, 0], [0, 0, 0], [0, 0, 0]]
# 1行目だけが変更される
インデックスエラーに注意
matrix = [
[1, 2, 3],
[4, 5, 6]
]
# 存在しない行や列にアクセスするとエラー
# print(matrix[2][0]) # IndexError: list index out of range
# print(matrix[0][3]) # IndexError: list index out of range
# 事前にサイズを確認
rows = len(matrix) # 行数: 2
cols = len(matrix[0]) # 列数: 3
print(f"行数: {rows}, 列数: {cols}")
if 2 < rows and 0 < cols:
print(matrix[2][0])
else:
print("指定した位置は存在しません")
2次元リストをループで処理する

行ごとに処理する
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 各行を表示
for row in matrix:
print(row)
# [1, 2, 3]
# [4, 5, 6]
# [7, 8, 9]
# 行番号も一緒に表示
for i, row in enumerate(matrix):
print(f"{i}行目: {row}")
# 0行目: [1, 2, 3]
# 1行目: [4, 5, 6]
# 2行目: [7, 8, 9]
すべての要素を処理する(ネストしたループ)
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# すべての要素を横に並べて表示
for row in matrix:
for item in row:
print(item, end=" ")
print() # 改行
# 1 2 3
# 4 5 6
# 7 8 9
# 行番号と列番号も一緒に表示
for i, row in enumerate(matrix):
for j, item in enumerate(row):
print(f"[{i}][{j}] = {item}")
# [0][0] = 1
# [0][1] = 2
# [0][2] = 3
# ...
条件に合う要素だけを処理する
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 偶数だけを表示
print("偶数の要素:")
for row in matrix:
for item in row:
if item % 2 == 0:
print(item, end=" ")
print() # 2 4 6 8
# 5より大きい要素の位置を表示
print("5より大きい要素の位置:")
for i, row in enumerate(matrix):
for j, item in enumerate(row):
if item > 5:
print(f"位置[{i}][{j}]: {item}")
# 位置[1][2]: 6
# 位置[2][0]: 7
# 位置[2][1]: 8
# 位置[2][2]: 9
実践的な使用例

成績表の管理
# 学生の成績データ
students = [
["太郎", 85, 78, 92], # [名前, 数学, 英語, 国語]
["花子", 92, 88, 85],
["次郎", 78, 85, 90],
["美香", 90, 92, 88]
]
# 各学生の平均点を計算
print("各学生の平均点:")
for student in students:
name = student[0]
scores = student[1:] # 名前以外の点数
average = sum(scores) / len(scores)
print(f"{name}: {average:.1f}点")
# 科目別の平均点を計算
subjects = ["数学", "英語", "国語"]
print("\n科目別平均点:")
for i, subject in enumerate(subjects):
total = sum(student[i + 1] for student in students)
average = total / len(students)
print(f"{subject}: {average:.1f}点")
ゲームの盤面(三目並べ)
# 三目並べの盤面を作成
board = [
[" ", " ", " "],
[" ", " ", " "],
[" ", " ", " "]
]
def display_board(board):
"""盤面を見やすく表示する"""
print(" 0 1 2")
for i, row in enumerate(board):
print(f"{i} {row[0]} | {row[1]} | {row[2]}")
if i < 2:
print(" ---------")
# ゲームのプレイ例
board[0][0] = "X" # プレイヤー1が左上に配置
board[1][1] = "O" # プレイヤー2が中央に配置
board[0][2] = "X" # プレイヤー1が右上に配置
display_board(board)
# 結果:
# 0 1 2
# 0 X | | X
# ---------
# 1 | O |
# ---------
# 2 | |
座標データの管理
# 座標データ(x, y, z)
points = [
[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0],
[7.0, 8.0, 9.0]
]
# 原点からの距離を計算
import math
print("各点の原点からの距離:")
for i, point in enumerate(points):
x, y, z = point
distance = math.sqrt(x**2 + y**2 + z**2)
print(f"点{i+1} ({x}, {y}, {z}): {distance:.2f}")
2次元リストの便利な操作

列だけを取り出す
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 2列目(インデックス1)だけを取り出す
column_1 = [row[1] for row in matrix]
print(column_1) # [2, 5, 8]
# すべての列を取り出す
for col_index in range(3):
column = [row[col_index] for row in matrix]
print(f"{col_index}列目: {column}")
# 0列目: [1, 4, 7]
# 1列目: [2, 5, 8]
# 2列目: [3, 6, 9]
行と列を入れ替える(転置)
matrix = [
[1, 2, 3],
[4, 5, 6]
]
# zip()を使って転置
transposed = list(zip(*matrix))
print(transposed) # [(1, 4), (2, 5), (3, 6)]
# リストに変換
transposed_list = [list(col) for col in zip(*matrix)]
print(transposed_list) # [[1, 4], [2, 5], [3, 6]]
2次元リストを平坦化する
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 平坦化(1次元リストに変換)
flat_list = [item for row in matrix for item in row]
print(flat_list) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
# sumを使った方法
flat_list2 = sum(matrix, [])
print(flat_list2) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
よくある質問
- Q2次元リストのサイズを調べるには?
- A
行数は
len()
、列数はlen(リスト[0])
で調べられます。matrix = [[1, 2, 3], [4, 5, 6]]
rows = len(matrix) # 2(行数)
cols = len(matrix[0]) # 3(列数)
- Q2次元リストのサイズを調べるには?
- A
行数は
len()
、列数はlen(リスト[0])
で調べられます。matrix = [[1, 2, 3], [4, 5, 6]]
rows = len(matrix) # 2(行数)
cols = len(matrix[0]) # 3(列数)
- Q不規則な2次元リスト(行ごとに列数が違う)は作れる?
- A
はい、pythonでは各行の長さが違っても大丈夫です。
irregular = [
[1, 2],
[3, 4, 5, 6],
[7]
]
- Q3次元リストも作れる?
- A
はい、リストの中にリストの中にリストを入れれば3次元になります。
cube = [
[[1, 2], [3, 4]],
[[5, 6], [7, 8]]
]
print(cube[0][1][0]) # 3
- Qnumpyとの違いは?
- A
2次元リストは柔軟ですが、numpyは数値計算に特化していて高速です。
# 普通の2次元リスト
matrix = [[1, 2], [3, 4]]
# numpy配列
import numpy as np
np_matrix = np.array([[1, 2], [3, 4]])
まとめ
pythonの2次元リストは、表・マトリックス・座標データなどを扱うときに非常に便利な機能です。
おさらい:
- 作成:
[[要素] * 列数 for _ in range(行数)]
で空の2次元リスト - アクセス:
リスト[行][列]
で特定の要素にアクセス - 処理:ネストしたfor文ですべての要素を処理
- 応用:転置、平坦化、列の抽出など便利な操作
コメント