Pythonのリスト(list)は、その要素として数値や文字列だけでなく、別のリストを持つこともできます。このように、リストの中にリストが入った構造を「入れ子(ネスト)リスト」と呼びます。
入れ子リストは、2次元のグリッド(行列やマス目)、座標データ、あるいはグループ化されたデータ(例:学生ごとの科目スコア)などを表現するのに非常に便利です。
この記事では、入れ子リストの基本的な作成方法、要素へのアクセス方法、そして要素の更新方法について解説します。
入れ子リストの作成
入れ子リストは、通常のリストと同様に [](角括弧)を使って作成します。外側の [] の中に、要素としてカンマ区切りのリストを配置します。
例として、3人の学生がそれぞれ3教科(国語、数学、英語)の試験を受けたスコアデータを考えます。
# [国語, 数学, 英語] のスコアを1つのリストとし、
# それを学生ごと(3人分)にまとめた入れ子リスト
student_scores = [
[80, 90, 85], # 1人目 (インデックス 0) のスコア
[92, 88, 95], # 2人目 (インデックス 1) のスコア
[78, 85, 80] # 3人目 (インデックス 2) のスコア
]
print(f"全体のスコアデータ: {student_scores}")
実行結果:
全体のスコアデータ: [[80, 90, 85], [92, 88, 95], [78, 85, 80]]
入れ子リストの要素へのアクセス
入れ子リストの要素にアクセスするには、インデックス参照の [] を2回(あるいはそれ以上)続けます。
my_list[インデックス1][インデックス2]
[インデックス1]:外側のリストのインデックス(どの内側リストか)[インデックス2]:内側のリストのインデックス(その中のどの要素か)
[column] for a nested list]
1. 内側のリスト全体へのアクセス
インデックスを1回だけ指定すると、その位置にある内側のリスト全体が取り出されます。
# 2人目 (インデックス 1) のスコアリスト全体を取得
scores_student_2 = student_scores[1]
print(f"2人目の全スコア: {scores_student_2}")
実行結果:
2人目の全スコア: [92, 88, 95]
2. 特定の要素へのアクセス
インデックスを2回指定することで、内側のリストの特定の要素に直接アクセスできます。
# 2人目 (インデックス 1) の、
# 3番目の科目 (インデックス 2 = 英語) のスコアを取得
score_student_2_english = student_scores[1][2]
print(f"2人目の英語のスコア: {score_student_2_english}")
# 1人目 (インデックス 0) の、
# 1番目の科目 (インデックス 0 = 国語) のスコアを取得
score_student_1_japanese = student_scores[0][0]
print(f"1人目の国語のスコア: {score_student_1_japanese}")
実行結果:
2人目の英語のスコア: 95
1人目の国語のスコア: 80
入れ子リストの要素の更新
入れ子リストの要素を更新する場合も、アクセスと同じようにインデックスを2回指定して代入(=)します。
print(f"更新前のデータ: {student_scores}")
# 1人目 (インデックス 0) の、
# 2番目の科目 (インデックス 1 = 数学) のスコアを 90 から 93 に変更
student_scores[0][1] = 93
print(f"更新後のデータ: {student_scores}")
実行結果:
更新前のデータ: [[80, 90, 85], [92, 88, 95], [78, 85, 80]]
更新後のデータ: [[80, 93, 85], [92, 88, 95], [78, 85, 80]]
student_scores[0][1] の値が 90 から 93 に置き換わっていることが確認できます。
まとめ
- 入れ子リストは、リストの要素として別のリストを持つ構造です。
my_list[index1]で内側のリスト全体にアクセスできます。my_list[index1][index2]で内側のリストの特定の要素にアクセス・更新できます。
2次元データを扱う際、[][] のようにインデックスを2つ使う感覚を掴むことが、入れ子リストを使いこなすための鍵となります。
