リスト、辞書

前回は、文字列操作の便利なテクニックについて学びましたね。これで文字列データをかなり自由に扱えるようになったはずです!

今回は、プログラミングで非常に重要な「複数のデータをまとめて扱う」ための強力な武器、「リスト (list型)」と「辞書 (dict型)」という新しいデータ型を学びます。これらをマスターすれば、例えばクラスの名簿を管理したり、ゲームのキャラクターのステータスを保存したり、センサーから取得した複数の測定値を記録したりと、プログラムでできることの幅が広がります。

AIの実装においても必要になるデータを扱う能力に直結してきます。焦らず、いつでも気軽に質問してください。

目次

  1. リスト (list):順番付きのデータコレクション
  2. 辞書 (dict):キーと値のペアでデータを管理
  3. リストと辞書の使い分け (ちょっとしたヒント)
  4. 演習

1. リスト (list):順番付きのデータコレクション

リストとは? なぜ便利?

リスト (list)」は、複数のデータを「順番に並べて」格納することができるデータ型です。ちょうど、買い物リストや、出席番号順に並んだ名簿のようなイメージですね。 今まで学んだ変数では、基本的に1つのデータしか入れられませんでした (例: name = "高専太郎"score = 80)。でも、例えばクラス全員の名前や、テストの全科目の点数のように、関連する複数のデータをまとめて扱いたい場面はたくさんあります。そんな時にリストが大活躍するんです!

リストを使うと、こんなメリットがあります:

Pythonでは、数値、文字列、さらには他のリストなど、異なるデータ型の値を同じリストに混在させることも可能です(ただ、通常は同じ種類のデータを入れることが多いです)。

リストの作り方:[] で囲むだけ

リストを作るのはとっても簡単! 角括弧 [] で囲み、各要素をカンマ , で区切って書きます。

# 空のリスト
empty_list = []
print(f"空のリスト: {empty_list}, 型: {type(empty_list)}")

# 数値のリスト (例: テストの点数)
scores = [80, 92, 75, 88, 60]
print(f"点数リスト: {scores}")

# 文字列のリスト (例: 好きな果物)
fruits = ["apple", "banana", "orange", "grape"]
print(f"果物リスト: {fruits}")

# 異なるデータ型を混ぜることも可能 (あまり推奨されない場合もある)
mixed_list = [10, "Hello", 3.14, True]
print(f"混合リスト: {mixed_list}")

実行結果:

空のリスト: [], 型: <class 'list'>
点数リスト: [80, 92, 75, 88, 60]
果物リスト: ['apple', 'banana', 'orange', 'grape']
混合リスト: [10, 'Hello', 3.14, True]

リストの要素へのアクセス:インデックスが大活躍

リストの中の個々のデータ(これを「要素」と呼びます)にアクセスするには、文字列の時と同じように「インデックス」を使います。 思い出してください、インデックスは 0 から始まる番号でしたね!

fruits = ["apple", "banana", "orange", "grape"]
# インデックス:  0        1         2        3

print(f"最初の果物: {fruits[0]}")      # インデックス0は 'apple'
print(f"3番目の果物: {fruits[2]}")    # インデックス2は 'orange'

# マイナスインデックスも使えます
print(f"最後の果物: {fruits[-1]}")     # -1は最後の要素 'grape'
print(f"最後から2番目の果物: {fruits[-2]}") # -2は最後から2番目の 'orange'

実行結果:

最初の果物: apple
3番目の果物: orange
最後の果物: grape
最後から2番目の果物: orange

注意! 文字列の時と同様に、存在しないインデックスを指定すると IndexError というエラーが発生します。例えば、上の fruits リストで fruits[4] としようとするとエラーです。気をつけてくださいね。

リストのスライス:一部分を切り出す (文字列操作の復習も兼ねて!)

文字列で学んだ「スライス」は、リストでも全く同じように使えます! [開始インデックス:終了インデックス:ステップ] の形で、リストの一部分を新しいリストとして取り出すことができます。

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

# インデックス1から4の手前まで (1, 2, 3)
print(f"numbers[1:4] -> {numbers[1:4]}")

# 最初からインデックス5の手前まで (0, 1, 2, 3, 4)
print(f"numbers[:5] -> {numbers[:5]}")

# インデックス5から最後まで (5, 6, 7, 8, 9)
print(f"numbers[5:] -> {numbers[5:]}")

# 2つおきに取り出す (0, 2, 4, 6, 8)
print(f"numbers[::2] -> {numbers[::2]}")

# リスト全体をコピー
copied_numbers = numbers[:]
print(f"コピーされたリスト: {copied_numbers}")

# リストを逆順にする
reversed_numbers = numbers[::-1]
print(f"逆順のリスト: {reversed_numbers}")

実行結果:

numbers[1:4] -> [1, 2, 3]
numbers[:5] -> [0, 1, 2, 3, 4]
numbers[5:] -> [5, 6, 7, 8, 9]
numbers[::2] -> [0, 2, 4, 6, 8]
コピーされたリスト: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
逆順のリスト: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

スライスは非常に便利なので、文字列とリスト、両方で使いこなせるようにしておきましょう!

リストの要素を変更する

リストの大きな特徴の一つは、作成した後でも要素の値を変更できることです。これを「ミュータブル (mutable)」である、と言います。(ちなみに、文字列は一度作ると変更できない「イミュータブル (immutable)」なデータ型です。)

要素を変更するには、インデックスで場所を指定して、新しい値を代入します。

colors = ["red", "green", "blue"]
print(f"変更前: {colors}")

colors[1] = "yellow" # インデックス1 (2番目の要素) を "yellow" に変更
print(f"変更後: {colors}")

colors[-1] = "purple" # 最後の要素を "purple" に変更
print(f"さらに変更後: {colors}")

実行結果:

変更前: ['red', 'green', 'blue']
変更後: ['red', 'yellow', 'blue']
さらに変更後: ['red', 'yellow', 'purple']

リストに要素を追加する:append(), insert(), extend()

リストの長さを変えたい、つまり要素を追加したい場合もよくあります。Pythonにはそのための便利なメソッドが用意されています。

リストから要素を削除する:del文, pop(), remove()

要素を追加するだけでなく、不要になった要素を削除することも重要です。

リストの便利な相棒たち:リストメソッド

リストには、上で紹介した追加・削除以外にも、様々な便利なメソッドや関連する関数があります。

これらのメソッドや関数を使いこなせると、リスト操作が格段に楽になりますよ!

リストの中にリスト!?:ネストしたリスト(多次元リストの第一歩)

リストの要素には、数値や文字列だけでなく、別のリストを入れることもできます。これを「ネストしたリスト」や「入れ子のリスト」と呼びます。これは、表のような2次元のデータや、もっと複雑な構造のデータを表現するのに役立ちます。

# 2x3の行列のようなデータ
matrix = [
    [1, 2, 3],
    [4, 5, 6]
]
print(f"ネストしたリスト: {matrix}")

# 要素へのアクセス
print(f"1行目 (インデックス0): {matrix[0]}")        # [1, 2, 3]
print(f"2行目3列目の要素: {matrix[1][2]}") # 6 (matrix[1]が[4,5,6]を返し、その[2]番目)

# 変更も可能
matrix[0][1] = 200
print(f"変更後のmatrix: {matrix}")

実行結果:

ネストしたリスト: [[1, 2, 3], [4, 5, 6]]
1行目 (インデックス0): [1, 2, 3]
2行目3列目の要素: 6
変更後のmatrix: [[1, 200, 3], [4, 5, 6]]

最初は少しややこしく感じるかもしれませんが、エクセルの表のようなものをイメージすると分かりやすいかもしれませんね。


2. 辞書 (dict):キーと値のペアでデータを管理

リストは順番でデータを管理しましたが、次に見る「辞書 (dict)」は、「キー (key)」と「値 (value)」のペアでデータを管理します。ちょうど、英和辞書で単語(キー)を引くと意味(値)が出てくるのに似ていますね。

リストでは要素にアクセスするのにインデックス(0からの番号)を使いましたが、辞書では自分で決めた「キー」を使って対応する「値」を取り出します。

辞書を使うと、こんなメリットがあります:

辞書の作り方:{} とキー・バリューペア

辞書は波括弧 {} を使って作ります。キーと値はコロン : で結びつけ、各ペアはカンマ , で区切ります。

# 空の辞書
empty_dict = {}
print(f"空の辞書: {empty_dict}, 型: {type(empty_dict)}")

# 生徒の情報を格納する辞書
student = {
    "name": "高専太郎", # "name"がキー, "高専太郎"が値
    "age": 18,
    "department": "情報工学科",
    "grades": [85, 90, 78] # 値にはリストも使える!
}
print(f"生徒の情報: {student}")

実行結果:

空の辞書: {}, 型: <class 'dict'>
生徒の情報: {'name': '高専太郎', 'age': 18, 'department': '情報工学科', 'grades': [85, 90, 78]}

キーに関する注意点:

辞書の要素へのアクセス:キーを指定する

辞書の中の値にアクセスするには、リストのインデックスの代わりに「キー」を使います。書き方は 辞書[キー] です。

student = {
    "name": "高専太郎",
    "age": 18,
    "department": "情報工学科"
}

print(f"名前: {student['name']}")
print(f"年齢: {student['age']}")
# print(f"趣味: {student['hobby']}") # これはエラー! 'hobby'というキーは存在しない

実行結果:

名前: 高専太郎
年齢: 18

注意! リストと同様に、存在しないキーを指定して値を取得しようとすると KeyError というエラーが発生します。これを避ける方法は後で紹介しますね (get() メソッド)。

辞書に要素を追加・変更する

辞書に新しいキーと値のペアを追加したり、既存のキーに対応する値を変更したりするのは簡単です。

profile = {"name": "技大花子"}
print(f"変更前: {profile}")

# 新しいキーと値のペアを追加
profile["age"] = 20
profile["city"] = "Nagaoka"
print(f"追加後: {profile}")

# 既存のキーの値を変更 (上書き)
profile["city"] = "Tokyo"
print(f"変更後: {profile}")

実行結果:

変更前: {'name': '技大花子'}
追加後: {'name': '技大花子', 'age': 20, 'city': 'Nagaoka'}
変更後: {'name': '技大花子', 'age': 20, 'city': 'Tokyo'}

指定したキーが辞書に既に存在すれば値が更新され、存在しなければ新しいキーと値のペアとして追加されます。

辞書から要素を削除する:del文, pop()

辞書から特定のキーと値のペアを削除する方法も見てみましょう。

辞書の便利な相棒たち:辞書メソッド

辞書にも、操作を助ける便利なメソッドがたくさんあります。


3. リストと辞書の使い分け (ちょっとしたヒント)

リストと辞書、どちらも複数のデータを扱うのに便利ですが、どんな時にどちらを使えばいいか迷うかもしれませんね。簡単な目安としてはこんな感じです。

もちろん、これらは絶対的なルールではありませんし、リストと辞書を組み合わせて使うこともよくあります(例えば、生徒の辞書を要素とするリストなど)。実際にプログラムを書いていく中で、どちらがその状況に適しているか、だんだんと感覚が掴めてくるはずです。


✏️ 本日の演習

さあ、今日学んだリストと辞書のテクニックを使って、実際に手を動かしてみましょう!

  1. VSCodeで新しいPythonファイル(例: practice04.py)を作成してください。
  2. リスト練習:
  3. 辞書練習:
  4. 発展 (リストと辞書の組み合わせ):



演習の解答例

# practice04.py

# 2. リスト練習
print("--- 2. リスト練習 ---")
favorite_languages = ["Python", "JavaScript", "C++"]
print(f"作成直後: {favorite_languages}")

# 最初の要素と最後の要素
print(f"最初の言語: {favorite_languages[0]}")
print(f"最後の言語: {favorite_languages[-1]}")

# 末尾に新しい言語を追加
favorite_languages.append("Rust")
print(f"append後: {favorite_languages}")

# 2番目の要素を変更
favorite_languages[1] = "TypeScript"
print(f"2番目を変更後: {favorite_languages}")

# いずれかの言語を削除 (例: C++)
if "C++" in favorite_languages:
    favorite_languages.remove("C++")
print(f"remove後: {favorite_languages}")
# もしdelを使うなら: del favorite_languages[2] (インデックスに注意)

# 要素数を表示
print(f"現在の要素数: {len(favorite_languages)}")

# アルファベット順に並び替え (元のリストを変更)
favorite_languages.sort()
print(f"ソート後: {favorite_languages}")
# sorted()を使うなら: sorted_languages = sorted(favorite_languages)
print("")

# 3. 辞書練習
print("--- 3. 辞書練習 ---")
my_pc_specs = {
    "OS": "Windows 11",
    "CPU": "Intel Core i7",
    "RAM_GB": 16,
    "GPU": "NVIDIA GeForce RTX 3060"
}
print(f"作成直後: {my_pc_specs}")

# OSとCPUの情報を表示
print(f"OS: {my_pc_specs['OS']}")
print(f"CPU: {my_pc_specs.get('CPU')}") # getでもOK

# 新しい情報を追加
my_pc_specs["storage_GB"] = 1024 # 1TB
print(f"ストレージ追加後: {my_pc_specs}")

# RAMの容量を倍に更新
my_pc_specs["RAM_GB"] = my_pc_specs["RAM_GB"] * 2
# または my_pc_specs["RAM_GB"] *= 2
print(f"RAM更新後: {my_pc_specs}")

# GPU情報の確認と表示
if 'GPU' in my_pc_specs:
    print(f"GPU: {my_pc_specs['GPU']}")
else:
    print("GPU情報なし")

# get() を使った別解
gpu_info = my_pc_specs.get("GPU")
if gpu_info: # NoneでなければTrue扱い
    print(f"GPU (get版): {gpu_info}")
else:
    print("GPU情報なし (get版)")
print("")

# 4. 発展 (リストと辞書の組み合わせ)
print("--- 4. 発展 ---")
friends_data = [
    {"name": "山田さん", "favorite_food": "ラーメン"},
    {"name": "田中さん", "favorite_food": "焼肉"},
    {"name": "鈴木さん", "favorite_food": "お寿司"}
]
print(f"友人データ: {friends_data}")

# 2番目の友人の名前と好きな食べ物を表示
if len(friends_data) >= 2:
    second_friend = friends_data[1] # インデックス1が2番目
    print(f"2番目の友人: {second_friend['name']}さん、好きな食べ物: {second_friend['favorite_food']}")
else:
    print("友人が2人未満です。")

# 新しい友人の情報を追加
new_friend = {"name": "加藤さん", "favorite_food": "パスタ"}
friends_data.append(new_friend)
print(f"新しい友人を追加後: {friends_data}")

print("\n演習お疲れ様でした!")

リストと辞書は、Pythonプログラミングの屋台骨とも言える非常に重要なデータ型です。とにかく経験を積んでください。「このデータはどうやって管理するのが効率的かな?」と考えるクセをつけると、より良いプログラムが書けるようになりますよ。

次回は、プログラムの流れを自在にコントロールするための重要な構文、「ループ (繰り返し処理)」と「条件分岐 (if文)」について学びます。(普通だったら、ループとか条件分岐を先に勉強するんだけど、僕の資料ではリストや文字列、辞書がループやforと深く結びついていることを踏まえて、この順番でやりました)

もし、リストと辞書の使い分けで迷ったり、「こんなデータ構造を作りたいんだけど、どうすればいいの?」といった具体的な疑問が出てきたりしたら、遠慮なく部長のカトに質問してくださいね。みんなで助け合いながら、スキルアップしていきましょう!