5. リストと辞書でデータを整理

前回は繰り返し処理について学びました。今回は、データを整理して扱うための「リスト」と「辞書」について学んでいきましょう。

5.1 リストとは?複数の値を順番に管理する方法

リストは、複数のデータを順番に並べて保存できる機能です:

リストの作り方

# リストの作り方
fruits = ["りんご", "バナナ", "オレンジ"]
numbers = [1, 2, 3, 4, 5]
mix = ["太郎", 15, "東京", 172.5]  # 異なる型も入れられる

# インデックス(添え字)で要素を取り出す
print(fruits[0])    # りんご(最初の要素)
print(fruits[-1])   # オレンジ(最後の要素)
print(fruits[1:3])  # ['バナナ', 'オレンジ'](範囲指定)

# リストの長さを調べる
print(len(fruits))  # 3

リストのポイント

  • 要素には0から始まる番号(インデックス)が付く
  • 異なる型のデータを混ぜて入れられる
  • 順番が重要な場合に便利

5.2 リストへの要素追加・削除・取り出し

リストは後から内容を変更できます:

リストへの追加

# リストへの追加
foods = ["カレー", "ラーメン"]
foods.append("寿司")        # 末尾に追加
foods.insert(1, "うどん")   # 指定位置に追加

# リストからの削除
foods.remove("ラーメン")    # 指定要素を削除
del foods[0]               # インデックスを指定して削除
last_food = foods.pop()    # 最後の要素を取り出して削除

# リストの操作
numbers = [3, 1, 4, 1, 5]
numbers.sort()            # 並び替え(昇順)
numbers.reverse()         # 順序を反転
numbers.count(1)          # 値の出現回数を数える

5.3 辞書とは?「言葉(キー)」と「意味(値)」で管理

辞書は、データをキーと値のペアで管理します:

辞書の作り方

# 辞書の作り方
student = {
    "name": "山田太郎",
    "age": 16,
    "grade": 2,
    "class": "A"
}

# 値の取り出し
print(student["name"])   # 山田太郎
print(student.get("age"))  # 16(安全な取り出し方)

# キーの一覧を取得
print(student.keys())    # キーの一覧
print(student.values())  # 値の一覧

5.4 辞書への要素追加・更新・削除

辞書も後から内容を変更できます:

辞書への追加

# 要素の追加と更新
scores = {"数学": 85}
scores["英語"] = 92      # 新しい要素を追加
scores["数学"] = 88      # 既存の要素を更新

# 要素の削除
del scores["英語"]      # キーを指定して削除
scores.clear()         # すべての要素を削除

# 安全な取り出し方
math_score = scores.get("数学", 0)  # キーがない場合は0を返す

5.5 リストと辞書を上手に使い分けよう

状況に応じて適切なデータ構造を選びましょう:

リストが適しているケース

# リストが適しているケース
# - 順番が重要な場合
favorite_games = ["マリオ", "ポケモン", "スプラトゥーン"]

# - 同じ種類のデータをまとめる場合
test_scores = [85, 92, 78, 90, 88]

# 辞書が適しているケース
# - データに名前を付けて管理する場合
person = {
    "name": "鈴木花子",
    "age": 16,
    "hobby": "バスケ"
}

# - キーと値の対応が重要な場合
capital = {
    "日本": "東京",
    "アメリカ": "ワシントンD.C.",
    "イギリス": "ロンドン"
}

5.6 リスト内包表記でスマートにリストを作る

リスト内包表記を使うと、簡潔にリストを作れます:

リスト内包表記の例

# 1から10までの二乗のリスト
squares = [x**2 for x in range(1, 11)]
print(squares)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# 偶数だけのリスト
evens = [x for x in range(10) if x % 2 == 0]
print(evens)    # [0, 2, 4, 6, 8]

# 文字列のリスト変換
word = "Python"
chars = [c.upper() for c in word]
print(chars)    # ['P', 'Y', 'T', 'H', 'O', 'N']

5.7 リストと辞書を組み合わせて複雑なデータを扱う

実践的なプログラムでは、リストと辞書を組み合わせることが多いです:

生徒の成績データ

# 生徒の成績データ
students = [
    {
        "name": "山田太郎",
        "scores": {"数学": 85, "英語": 92, "国語": 88}
    },
    {
        "name": "鈴木花子",
        "scores": {"数学": 92, "英語": 88, "国語": 90}
    }
]

# データの活用例
for student in students:
    print(f"\n{student['name']}の成績:")
    for subject, score in student['scores'].items():
        print(f"{subject}: {score}点")

課題 1. クラス名簿(名前・点数)を辞書で管理して平均点を求めるプログラム

クラスの成績管理プログラム

# クラスの成績管理プログラム
class_scores = {
    "山田太郎": 85,
    "鈴木花子": 92,
    "佐藤次郎": 78,
    "田中美咲": 95,
    "高橋健一": 88
}

# 平均点を計算
total = sum(class_scores.values())
average = total / len(class_scores)

print(f"クラスの平均点:{average:.1f}")

# 平均点以上の生徒を表示
print("\n平均点以上の生徒:")
for name, score in class_scores.items():
    if score >= average:
        print(f"{name}: {score}点")

# チャレンジ:
# - 最高点と最低点の生徒を表示してみよう
# - 点数帯(90点以上、80-89点、...)ごとの人数を集計してみよう
# - 複数の科目の点数を管理してみよう

課題 2. 好きな果物リストを作り、最初と最後の要素を表示するプログラム

好きな果物リストを作り、最初と最後の要素を表示するプログラム

# 果物リストを作成
fruits = []

# 果物を追加
while True:
    fruit = input("好きな果物を入力してください(終了はquit):")
    if fruit == "quit":
        break
    fruits.append(fruit)

# リストが空でない場合のみ表示
if fruits:
    print("\n入力された果物リスト:")
    print(fruits)
    print(f"最初の果物:{fruits[0]}")
    print(f"最後の果物:{fruits[-1]}")
    print(f"果物の総数:{len(fruits)}個")
else:
    print("果物が入力されませんでした")

# チャレンジ:
# - 果物を五十音順に並び替えてみよう
# - 重複する果物を除外してみよう
# - 果物とその好きな度合い(5段階)も記録してみよう

まとめ

この章で学んだこと:

  • リストは順序付きのデータ集合
  • 辞書はキーと値のペアでデータを管理
  • それぞれの特徴を活かした使い分けが重要
  • リスト内包表記で効率的なコード作成
  • 実践的なデータ管理の方法

次の章では、関数について学び、コードを再利用可能な形にまとめる方法を身につけます!