【初心者向け】Pythonの2次元リスト入門|作り方から活用法まで

python

「表のようなデータを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]

よくある質問

Q
2次元リストのサイズを調べるには?
A

行数はlen()、列数はlen(リスト[0])で調べられます。

matrix = [[1, 2, 3], [4, 5, 6]]
rows = len(matrix) # 2(行数)
cols = len(matrix[0]) # 3(列数)
Q
2次元リストのサイズを調べるには?
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]
]
Q
3次元リストも作れる?
A

はい、リストの中にリストの中にリストを入れれば3次元になります。

cube = [
[[1, 2], [3, 4]],
[[5, 6], [7, 8]]
]
print(cube[0][1][0]) # 3
Q
numpyとの違いは?
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文ですべての要素を処理
  • 応用:転置、平坦化、列の抽出など便利な操作

コメント

タイトルとURLをコピーしました