[Python] 2次元リストの使い方(初期化/追加/参照など)を詳しく解説

Pythonで2次元リストを扱う際には、リストのリストとして表現します。初期化は、例えばmatrix = [[0]*3 for _ in range(3)]のように行います。

要素の追加はappend()メソッドを使用し、matrix.append([1, 2, 3])のように新しい行を追加できます。

要素の参照はインデックスを用いて行い、matrix[0][1]で1行目の2列目の要素にアクセスできます。

2次元リストは柔軟で、異なる長さのリストを含むことも可能です。

この記事でわかること
  • 2次元リストの基本的な構造と初期化方法
  • 行や列の追加、特定の位置への要素の挿入方法
  • インデックスやスライスを使った要素の参照方法
  • 行列の転置や加算、減算、積の計算方法
  • 2次元リストを用いたデータの集計方法

目次から探す

2次元リストの基本

2次元リストとは

2次元リストは、リストの中にリストを持つデータ構造で、行と列の形式でデータを格納します。

例えば、行列のようにデータを整理することができ、各要素には行と列のインデックスを使ってアクセスします。

Pythonでは、リストを使って簡単に2次元リストを作成できます。

2次元リストの利点と用途

2次元リストの主な利点と用途は以下の通りです。

スクロールできます
利点・用途説明
データの整理行と列でデータを整理しやすい。
簡単なアクセスインデックスを使って特定の要素に簡単にアクセスできる。
数学的操作行列の演算やデータの集計に利用できる。
可読性データの構造が明確で、可読性が高い。

Pythonでの2次元リストの基本構文

Pythonで2次元リストを作成する基本的な構文は以下の通りです。

# 2次元リストの初期化
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

この例では、3行3列の2次元リストを作成しています。

各要素には、行と列のインデックスを使ってアクセスできます。

例えば、matrix[0][1]は1行2列目の要素(値は2)を指します。

2次元リストの初期化

空の2次元リストの作成

空の2次元リストを作成するには、単にリストのリストを初期化します。

以下のように記述します。

# 空の2次元リストの作成
empty_matrix = []

このempty_matrixは、要素を追加するまで空の状態です。

後で行や列を追加することができます。

固定サイズの2次元リストの作成

固定サイズの2次元リストを作成する場合、リスト内にリストを埋め込むことで初期化します。

以下の例では、3行4列のリストを作成しています。

# 固定サイズの2次元リストの作成
fixed_size_matrix = [[0 for _ in range(4)] for _ in range(3)]

このコードでは、すべての要素が0で初期化された3行4列の2次元リストが作成されます。

_はループ変数を使わないことを示しています。

リスト内包表記を使った初期化

リスト内包表記を使うことで、より簡潔に2次元リストを初期化できます。

以下の例では、1から9までの数値を持つ3行3列のリストを作成しています。

# リスト内包表記を使った初期化
matrix_with_comprehension = [[j + 1 + i * 3 for j in range(3)] for i in range(3)]

このコードでは、matrix_with_comprehensionに1から9までの数値が格納された3行3列の2次元リストが作成されます。

各行は、内包表記を使って生成されています。

2次元リストへの要素の追加

行の追加

2次元リストに新しい行を追加するには、append()メソッドを使用します。

以下の例では、既存の2次元リストに新しい行を追加しています。

# 既存の2次元リスト
matrix = [
    [1, 2, 3],
    [4, 5, 6]
]
# 新しい行の追加
matrix.append([7, 8, 9])

このコードを実行すると、matrixは次のようになります。

[[1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]]

列の追加

2次元リストに新しい列を追加するには、各行に対して新しい要素を追加する必要があります。

以下の例では、すべての行に新しい列を追加しています。

# 既存の2次元リスト
matrix = [
    [1, 2, 3],
    [4, 5, 6]
]
# 新しい列の追加
for row in matrix:
    row.append(0)  # 各行に0を追加

このコードを実行すると、matrixは次のようになります。

[[1, 2, 3, 0],
 [4, 5, 6, 0]]

特定の位置への要素の挿入

特定の位置に要素を挿入するには、insert()メソッドを使用します。

以下の例では、1行目の2列目に新しい要素を挿入しています。

# 既存の2次元リスト
matrix = [
    [1, 2, 3],
    [4, 5, 6]
]
# 特定の位置への要素の挿入
matrix[0].insert(1, 9)  # 1行目の2列目に9を挿入

このコードを実行すると、matrixは次のようになります。

[[1, 9, 2, 3],
 [4, 5, 6]]

このようにして、2次元リストに対して行や列を追加したり、特定の位置に要素を挿入することができます。

2次元リストの参照

インデックスを使った要素の参照

2次元リストの特定の要素にアクセスするには、行と列のインデックスを使用します。

以下の例では、特定の要素を参照しています。

# 2次元リストの作成
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
# 特定の要素の参照
element = matrix[1][2]  # 2行3列目の要素を参照

このコードを実行すると、elementには値6が格納されます。

インデックスは0から始まるため、matrix[1][2]は2行目の3列目を指します。

スライスを使った部分リストの取得

スライスを使用することで、2次元リストの一部を取得することができます。

以下の例では、特定の行と列の範囲を取得しています。

# 2次元リストの作成
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
# スライスを使った部分リストの取得
sub_matrix = [row[1:3] for row in matrix]  # 各行の2列目から3列目を取得

このコードを実行すると、sub_matrixには次のようなリストが格納されます。

[[2, 3],
 [5, 6],
 [8, 9]]

ループを使った全要素の参照

2次元リストの全要素を参照するには、ネストされたループを使用します。

以下の例では、すべての要素を出力しています。

# 2次元リストの作成
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
# ループを使った全要素の参照
for i in range(len(matrix)):
    for j in range(len(matrix[i])):
        print(matrix[i][j], end=' ')
    print()  # 行の終わりで改行

このコードを実行すると、次のように全要素が出力されます。

1 2 3 
4 5 6 
7 8 9

このように、インデックス、スライス、ループを使って2次元リストの要素を参照することができます。

2次元リストの更新

インデックスを使った要素の更新

2次元リストの特定の要素を更新するには、インデックスを指定して新しい値を代入します。

以下の例では、特定の要素を更新しています。

# 2次元リストの作成
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
# 特定の要素の更新
matrix[1][1] = 10  # 2行2列目の要素を10に更新

このコードを実行すると、matrixは次のようになります。

[[1, 2, 3],
 [4, 10, 6],
 [7, 8, 9]]

スライスを使った部分リストの更新

スライスを使用して、2次元リストの一部を一度に更新することもできます。

以下の例では、特定の行の要素を更新しています。

# 2次元リストの作成
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
# スライスを使った部分リストの更新
matrix[0][1:3] = [20, 30]  # 1行目の2列目と3列目を更新

このコードを実行すると、matrixは次のようになります。

[[1, 20, 30],
 [4, 5, 6],
 [7, 8, 9]]

ループを使った全要素の更新

2次元リストの全要素を一括で更新するには、ネストされたループを使用します。

以下の例では、すべての要素に1を加算しています。

# 2次元リストの作成
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
# ループを使った全要素の更新
for i in range(len(matrix)):
    for j in range(len(matrix[i])):
        matrix[i][j] += 1  # 各要素に1を加算

このコードを実行すると、matrixは次のようになります。

[[2, 3, 4],
 [5, 6, 7],
 [8, 9, 10]]

このように、インデックス、スライス、ループを使って2次元リストの要素を更新することができます。

2次元リストの削除

行の削除

2次元リストから特定の行を削除するには、del文またはpop()メソッドを使用します。

以下の例では、2行目を削除しています。

# 2次元リストの作成
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
# 行の削除
del matrix[1]  # 2行目を削除

このコードを実行すると、matrixは次のようになります。

[[1, 2, 3],
 [7, 8, 9]]

列の削除

2次元リストから特定の列を削除するには、各行に対してpop()メソッドを使用します。

以下の例では、2列目を削除しています。

# 2次元リストの作成
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
# 列の削除
for row in matrix:
    row.pop(1)  # 各行の2列目を削除

このコードを実行すると、matrixは次のようになります。

[[1, 3],
 [4, 6],
 [7, 9]]

特定の要素の削除

特定の要素を削除するには、remove()メソッドを使用します。

以下の例では、値5を削除しています。

# 2次元リストの作成
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
# 特定の要素の削除
for row in matrix:
    if 5 in row:
        row.remove(5)  # 値5を削除

このコードを実行すると、matrixは次のようになります。

[[1, 2, 3],
 [4, 6],
 [7, 8, 9]]

このように、行、列、特定の要素を削除する方法を使って、2次元リストを柔軟に操作することができます。

2次元リストの応用例

行列の転置

行列の転置とは、行と列を入れ替える操作です。

2次元リストを使って行列を転置するには、リスト内包表記を使用します。

以下の例では、3行2列の行列を転置しています。

# 2次元リストの作成
matrix = [
    [1, 2],
    [3, 4],
    [5, 6]
]
# 行列の転置
transposed_matrix = [[row[i] for row in matrix] for i in range(len(matrix[0]))]

このコードを実行すると、transposed_matrixは次のようになります。

[[1, 3, 5],
 [2, 4, 6]]

行列の加算と減算

2つの同じサイズの行列を加算または減算するには、ネストされたループを使用します。

以下の例では、2つの行列を加算しています。

# 2つの2次元リストの作成
matrix_a = [
    [1, 2, 3],
    [4, 5, 6]
]
matrix_b = [
    [7, 8, 9],
    [10, 11, 12]
]
# 行列の加算
sum_matrix = [[matrix_a[i][j] + matrix_b[i][j] for j in range(len(matrix_a[0]))] for i in range(len(matrix_a))]

このコードを実行すると、sum_matrixは次のようになります。

[[8, 10, 12],
 [14, 16, 18]]

同様に、行列の減算も行えます。

# 行列の減算
difference_matrix = [[matrix_a[i][j] - matrix_b[i][j] for j in range(len(matrix_a[0]))] for i in range(len(matrix_a))]

このコードを実行すると、difference_matrixは次のようになります。

[[-6, -6, -6],
 [-6, -6, -6]]

行列の積

行列の積を計算するには、内積を考慮する必要があります。

以下の例では、2つの行列の積を計算しています。

# 2つの2次元リストの作成
matrix_a = [
    [1, 2],
    [3, 4]
]
matrix_b = [
    [5, 6],
    [7, 8]
]
# 行列の積
product_matrix = [[sum(matrix_a[i][k] * matrix_b[k][j] for k in range(len(matrix_b))) for j in range(len(matrix_b[0]))] for i in range(len(matrix_a))]

このコードを実行すると、product_matrixは次のようになります。

[[19, 22],
 [43, 50]]

2次元リストを使ったデータの集計

2次元リストを使ってデータを集計することも可能です。

以下の例では、各行の合計を計算しています。

# 2次元リストの作成
data = [
    [10, 20, 30],
    [40, 50, 60],
    [70, 80, 90]
]
# 各行の合計を計算
row_sums = [sum(row) for row in data]

このコードを実行すると、row_sumsは次のようになります。

[60, 150, 240]

このように、2次元リストは行列の演算やデータの集計に非常に便利なデータ構造です。

よくある質問

2次元リストのサイズを動的に変更する方法は?

2次元リストのサイズを動的に変更するには、append()メソッドを使用して新しい行を追加したり、各行に対してappend()を使って新しい列を追加することができます。

また、del文を使って行を削除することも可能です。

例えば、matrix.append([新しい要素])で行を追加し、del matrix[行番号]で行を削除できます。

2次元リストのメモリ効率を改善する方法は?

2次元リストのメモリ効率を改善するためには、必要なサイズのリストを事前に初期化することが重要です。

また、NumPyライブラリを使用することで、より効率的にメモリを管理し、計算を高速化することができます。

NumPyは、配列のサイズを固定し、データ型を指定することで、メモリの使用を最適化します。

2次元リストとNumPy配列の違いは?

2次元リストはPythonの組み込みデータ構造で、柔軟性がありますが、計算速度が遅い場合があります。

一方、NumPy配列は数値計算に特化したライブラリで、メモリ効率が良く、ベクトル化された演算が可能です。

NumPyを使用することで、大規模なデータセットの処理が効率的に行えます。

まとめ

この記事では、Pythonにおける2次元リストの基本的な使い方から応用例までを詳しく解説しました。

2次元リストは、データの整理や数学的な操作に非常に便利なデータ構造であり、さまざまな場面で活用できます。

ぜひ、実際のプログラミングにおいて2次元リストを使ってみてください。

  • URLをコピーしました!
目次から探す