5. リストと辞書でデータを整理
目次
- 5.1 リストとは?複数の値を順番に管理する方法
- 5.2 リストへの要素追加・削除・取り出し
- 5.3 辞書とは?「言葉(キー)」と「意味(値)」で管理
- 5.4 辞書への要素追加・更新・削除
- 5.5 リストと辞書を上手に使い分けよう
- 5.6 リスト内包表記でスマートにリストを作る
- 5.7 リストと辞書を組み合わせて複雑なデータを扱う
- Ex.1 クラス名簿(名前・点数)を辞書で管理して平均点を求めるプログラム
- Ex.2 好きな果物リストを作り、最初と最後の要素を表示するプログラム
この講座で使用する Google Colab の URL
5. リストと辞書でデータを整理 (Google Colab)
演習課題
Ex.5. リストと辞書でデータを整理 (Google Colab)
この講座で使用する Python, Jupyter Notebook のファイルと実行環境
Lesson 5: high-school-python-code (GitHub)
5.1 リストとは?複数の値を順番に管理する方法
学校の名簿、テストの各科目の点数など、私たちの周りには「データの一覧」がたくさんあります。Python では、このような複数のデータを順番に管理するために「リスト」という機能を使います。
リスト型 (list)
リストは配列(Array)とも呼ばれることがありますが、Python では list というデータ型です。
リストの作り方
基本的なリストの作成
fruits = ["りんご", "バナナ", "オレンジ"]
numbers = [1, 2, 3, 4, 5]
# 異なる型のデータも OK
mix = ["太郎", 15, "東京", 172.5]
# 空のリストを定義する
my_list = []
リストの要素を取り出す
リストの要素を指定するには、文字列と同じようにインデックスを使います。また、文字列で学んだのと同じように、スライスを使ったり、マイナスのインデックスを使ったりすることもできます。
リストの要素を取り出す
fruits = ["りんご", "バナナ", "オレンジ", "ぶどう", "メロン"]
# インデックスで要素を取り出す
print(fruits[0]) # りんご (最初の要素)
print(fruits[1]) # バナナ (2 番目の要素)
print(fruits[-1]) # メロン (最後の要素)
print(fruits[-2]) # ぶどう (後ろから 2 番目の要素)
# 範囲を指定して取り出す (スライス)
print(fruits[1:3]) # ['バナナ', 'オレンジ']
print(fruits[:3]) # ['りんご', 'バナナ', 'オレンジ']
print(fruits[2:]) # ['オレンジ', 'ぶどう', 'メロン']
リストの長さを調べる
また、len 関数を使ってリストの長さ(要素数)を調べることもできます。
リストの長さを調べる
fruits = ["りんご", "バナナ", "オレンジ"]
length = len(fruits)
print(f"リストの長さ:{length}") # 3
リストの型ヒント
リストにも型ヒントを書くことができます。リストの要素の型が決まっている場合は、型ヒントを書くことでコードを読みやすくすることができます。
リストの型ヒント
fruits: list[str] = ["りんご", "バナナ", "オレンジ"]
numbers: list[int] = [1, 2, 3, 4, 5]
この他にも色々な型ヒントの書き方がありますが(any, union など)、ここでは長くなるので省略します。
5.2 リストへの要素追加・削除・取り出し
リストは、一度作成した後でも内容を自由に変更することができます。要素の追加、削除、並び替えなど、色々な操作が可能です。
リストへの要素の追加
1. append(): 末尾に追加
append() は、リストの末尾に要素を追加するメソッドです。
append() で末尾に追加
foods = ["カレー", "ラーメン"]
foods.append("寿司")
print(foods) # ['カレー', 'ラーメン', '寿司']
# 複数回追加
foods.append("うどん")
foods.append("そば")
print(foods) # ['カレー', 'ラーメン', '寿司', 'うどん', 'そば']
2. insert(): 指定位置に追加
insert() は、指定した位置に要素を追加するメソッドです。
insert() で指定位置に追加
foods = ["カレー", "ラーメン", "寿司"]
# インデックス 1 の位置に挿入
foods.insert(1, "うどん")
print(foods) # ['カレー', 'うどん', 'ラーメン', '寿司']
# 先頭に追加
foods.insert(0, "そば")
print(foods) # ['そば', 'カレー', 'うどん', 'ラーメン', '寿司']
リストからの要素の削除
1. remove(): 指定した要素を削除
remove() は、指定した要素を削除するメソッドです。
remove() で指定した要素を削除
foods = ["カレー", "ラーメン", "寿司", "うどん"]
foods.remove("ラーメン")
print(foods) # ['カレー', '寿司', 'うどん']
# 存在しない要素を削除しようとするとエラーになります
foods.remove("パスタ")
2. del: インデックスを指定して削除
del は、指定したインデックスの要素を削除する演算子です。細かい話なのですが、メソッドではなく演算子です。
del でインデックスを指定して削除
foods = ["カレー", "ラーメン", "寿司", "うどん"]
# インデックス 1 の要素を削除
del foods[1]
print(foods) # ['カレー', '寿司', 'うどん']
# 範囲を指定して削除
# インデックス 1 から 2 までを削除
del foods[1:3]
print(foods) # ['カレー']
# 範囲外のインデックスを指定するとエラーになります
del foods[10]
3. pop(): 要素を取り出して削除
pop() は、指定した要素を取り出して削除するメソッドです。remove() や del とは違い、削除と同時に値を代入して使うことができます。
pop() で要素を取り出して削除
foods = ["カレー", "ラーメン", "寿司"]
last_food = foods.pop()
print(f"取り出した要素: {last_food}") # 寿司
print(f"残りのリスト: {foods}") # ['カレー', 'ラーメン']
# インデックスを指定して取り出し
second_food = foods.pop(1) # インデックス1の要素を取り出す
print(f"取り出した要素: {second_food}") # ラーメン
print(f"残りのリスト: {foods}") # ['カレー']
削除方法の使い分け
- remove(): 削除したい要素の値が分かっている時
- del: 削除したい位置が分かっている時
- pop(): 削除と同時に値を使いたい時
リストの操作と並び替え
1. sort(): 要素の並び替え
sort() は、リストの要素を並び替えるメソッドです。デフォルトでは昇順に並び替えられます。
Q: 昇順と降順の違いは?
A: 昇順は小さい順、降順は大きい順に並び替えます。昇順は小さい方から登っていくようなイメージ、降順は大きい方から下っていくようなイメージです。
sort() で要素の並び替え
# 数値のソート
numbers = [3, 1, 4, 1, 5, 9, 2]
numbers.sort() # 昇順に並び替え
print(numbers) # [1, 1, 2, 3, 4, 5, 9]
numbers.sort(reverse=True) # 降順に並び替え
print(numbers) # [9, 5, 4, 3, 2, 1, 1]
# 文字列のソート
names = ["田中", "山田", "佐藤", "鈴木"]
names.sort() # 50音順に並び替え
print(names) # ['佐藤', '鈴木', '田中', '山田']
2. reverse(): 順序の反転
reverse() は、リストの順序を反転するメソッドです。
reverse() で順序を反転
foods = ["カレー", "ラーメン", "寿司"]
foods.reverse()
print(foods) # ['寿司', 'ラーメン', 'カレー']
3. count(): 要素の数を数える
count() は、指定した要素がリスト内に何回出現するかを数えるメソッドです。
count() で要素の数を数える
numbers = [1, 2, 3, 2, 1, 2, 4, 5]
count_2 = numbers.count(2)
print(f"2 の出現回数: {count_2}") # 3
# 文字列でも使える
fruits = ["りんご", "バナナ", "りんご", "オレンジ", "りんご"]
count_apple = fruits.count("りんご")
print(f"りんごの数: {count_apple}") # 3
Q: リストの操作でよくあるミスは?
A: 以下の点に注意しましょう:
- 存在しない要素の削除(remove)
- 範囲外のインデックスへのアクセス
- 異なる型のデータのソート
- 元のリストが変更されることの認識
5.3 辞書とは?「言葉(キー)」と「意味(値)」で管理
Python の「辞書(dictionary)」は、データを「キー(検索するための言葉)」と「値(対応する情報)」のペアで管理します。
実際の辞書でも、「単語」とその「意味」がセットになっています。
辞書 (Dictionary: dict)
辞書の作り方
このように辞書を作ることができます。
生徒の情報を辞書で管理
student = {
"name": "山田太郎", # キー: "name", 値: "山田太郎"
"age": 16, # キー: "age", 値: 16
"grade": 2, # キー: "grade", 値: 2
"class": "A" # キー: "class", 値: "A"
}
# 空の辞書を作る
my_dict = {}
値の取り出し方
辞書の値を取り出すには、キーを指定して取り出す方法と、get() メソッドを使う方法があります。
辞書の値を取り出す
student = {
"name": "山田太郎",
"age": 16,
"grade": 2,
"class": "A"
}
# [ ] を使って取り出す
print(student["name"]) # 山田太郎
print(student["age"]) # 16
# get() を使って安全に取り出す
print(student.get("name")) # 山田太郎
print(student.get("height")) # None (キーが存在しない場合)
print(student.get("height", 0)) # 0 (デフォルト値を指定)
dict[key] と dict.get() の違い
[key]
はキーが存在しないとエラーになるget(key)
はキーが存在しなくても安全 (None を返す)get(key, default)
は第 2 引数でデフォルト値を指定できる (例えば、なかったら 0 を返すなど)
辞書の基本操作
1. 値の追加・更新
値は、辞書を定義するタイミングで全て用意しておかなくても、後から追加したり、更新(変更)したりすることができます。
辞書の値の追加・更新
student = {"name": "山田太郎", "age": 16}
# 新しい要素の追加
student["grade"] = 2
student["class"] = "A"
print(student) # {'name': '山田太郎', 'age': 16, 'grade': 2, 'class': 'A'}
# 値の更新
student["age"] = 17
print(student) # {'name': '山田太郎', 'age': 17, 'grade': 2, 'class': 'A'}
2. キーと値の取得
辞書のキーと値を取得するには、keys() メソッドと values() メソッドを使います。
キーと値の取得
student = {
"name": "山田太郎",
"age": 16,
"grade": 2,
"class": "A"
}
# キーの一覧を取得
keys = student.keys()
print(list(keys)) # ['name', 'age', 'grade', 'class']
# 値の一覧を取得
values = student.values()
print(list(values)) # ['山田太郎', 16, 2, 'A']
# キーと値のペアを取得
items = student.items()
for key, value in items:
print(f"{key}: {value}")
3. 要素の削除
要素の削除は、list の場合と同じように del や pop() を使うことができます。
要素の削除
student = {
"name": "山田太郎",
"age": 16,
"grade": 2,
"temp": "一時データ"
}
# del で削除
del student["temp"]
# pop で削除と同時に値を取得
age = student.pop("age")
print(f"取り出した年齢: {age}")
print(f"残りのデータ: {student}")
Q: 辞書のキーには何を使える?
A: 以下のルールがあります:
- 変更不可能な型のみ使用可能(文字列、数値、タプルなど)
- リストは使用不可(変更可能なため)
- 同じキーは使用不可(一意である必要がある)
- キーは大文字小文字を区別する
なお、タプル (tuple) についてはレッスン 11 で扱います。
5.4 辞書への要素追加・更新・削除
辞書は、作成後でも要素の追加、更新、削除が自由にできます。ただし、操作によってはエラーになる可能性があるので、安全な操作方法を覚えておくことが大切です。
辞書への要素の追加と更新
1. 新しい要素の追加
新しい要素の追加
# 空の辞書から始める
student = {}
# 要素を追加していく
student["name"] = "山田太郎"
student["age"] = 16
student["class"] = "A"
print(student) # {'name': '山田太郎', 'age': 16, 'class': 'A'}
# 複数の要素を一度に追加
student.update({
"grade": 2,
"club": "サッカー部"
})
print(student)
2. 既存の要素の更新
既存の要素の更新
# 成績データの更新
scores = {
"国語": 85,
"数学": 78,
"英語": 92
}
# 個別に更新
scores["数学"] = 82 # 数学の点数を更新
# 複数の要素を一度に更新
scores.update({
"国語": 88,
"英語": 95
})
print("=== 最新の成績 ===")
for subject, score in scores.items():
print(f"{subject}: {score}点")
辞書からの要素の削除
1. del による削除
del による削除
student = {
"name": "山田太郎",
"age": 16,
"grade": 2,
"temp": "仮データ"
}
# 特定の要素を削除
del student["temp"]
print(student) # tempキーが削除された辞書が表示される
2. pop による削除(値の取り出し)
pop による削除(値の取り出し)
# popで要素を削除しながら値を取得
student = {
"name": "山田太郎",
"age": 16,
"grade": 2
}
# 要素を削除して値を取得
age = student.pop("age")
print(f"取り出した年齢: {age}")
print(f"残りのデータ: {student}")
# 存在しないキーでもエラーにならないpop
club = student.pop("club", "未所属") # キーが存在しない場合のデフォルト値
print(f"部活動: {club}") # 未所属
3. clear による全要素の削除
clear による全要素の削除
scores = {"国語": 85, "数学": 92, "英語": 78}
print(f"クリア前: {scores}")
scores.clear() # すべての要素を削除
print(f"クリア後: {scores}") # {}
安全な辞書の操作
1. キーの存在確認
キーの存在確認
student = {"name": "山田太郎", "age": 16}
# in を使ってキーの存在を確認
if "grade" in student:
print(f"学年: {student['grade']}")
else:
print("学年は登録されていません")
# キーが存在しない場合のデフォルト値を指定
grade = student.get("grade", "未設定")
print(f"学年: {grade}")
2. setdefault の使用
setdefault の使用
# キーがない場合にデフォルト値を設定して取得
scores = {"数学": 85, "英語": 92}
# 国語の点数がなければ0を設定
japanese = scores.setdefault("国語", 0)
print(f"国語: {japanese}点")
print(scores) # {'数学': 85, '英語': 92, '国語': 0}
実践的な例
1. 商品在庫管理
商品在庫管理
# 商品の在庫管理
inventory = {
"りんご": 25,
"バナナ": 18,
"オレンジ": 30
}
def update_stock(item, quantity):
"""在庫数を更新する関数"""
if item in inventory:
inventory[item] += quantity
print(f"{item}の在庫を{quantity}個追加しました")
else:
inventory[item] = quantity
print(f"新商品「{item}」を{quantity}個追加しました")
def check_stock(item):
"""在庫数を確認する関数"""
return inventory.get(item, 0)
# 在庫の更新
update_stock("りんご", 5)
update_stock("メロン", 12)
# 在庫の確認
print("\n=== 在庫状況 ===")
for item, quantity in inventory.items():
print(f"{item}: {quantity}個")
Q: 辞書を操作する時の注意点は? A: 以下のようなエラーに注意しましょう: 1. 存在しないキーへのアクセス(KeyError) 2. 削除済みのキーへのアクセス 3. キーと値の型の不一致 4. ミュータブル(変更可能)なキーの使用
メソッドの使い分け - get()
: 安全に値を取得(キーがなくてもエラーにならない) - setdefault()
:
取得と同時にデフォルト値を設定 - update()
: 複数の要素を一度に更新 - pop()
: 要素を削除しながら値を取得 - clear()
:
すべての要素を削除
5.5 リストと辞書を上手に使い分けよう
プログラミングでは、状況に応じて適切なデータ構造を選ぶことが重要です。ここでは、リストと辞書のそれぞれの特徴を理解し、適切な使い分けができるようになりましょう。
リストと辞書の特徴
リストの特徴
- 順番が保持される
- インデックス(0, 1, 2...)で要素にアクセス
- 同じ値を複数持てる
- 要素の追加・削除が簡単
辞書の特徴
- キーと値のペアで管理
- 順番は保持されない
- キーは一意(重複不可)
- キーで素早くアクセス可能
リストが適しているケース
1. 順番が重要な場合
好きなゲームのランキング
favorite_games = ["マリオ", "ポケモン", "スプラトゥーン"]
print("ベスト3:")
for i, game in enumerate(favorite_games, 1):
print(f"{i}位: {game}")
# 行動の手順
steps = [
"材料を集める",
"粉と水を混ぜる",
"こねる",
"発酵させる",
"焼く"
]
print("\nパンの作り方:")
for i, step in enumerate(steps, 1):
print(f"手順{i}: {step}")
2. 同じ種類のデータをまとめる場合
テストの点数リスト
test_scores = [85, 92, 78, 90, 88]
# 基本的な統計計算
average = sum(test_scores) / len(test_scores)
highest = max(test_scores)
lowest = min(test_scores)
print(f"平均点: {average}")
print(f"最高点: {highest}")
print(f"最低点: {lowest}")
辞書が適しているケース
1. データに名前を付けて管理する場合
生徒の情報
student = {
"name": "鈴木花子",
"age": 16,
"grade": 2,
"class": "A",
"hobby": "バスケ",
"favorite_subject": "数学"
}
# 必要な情報だけを取り出せる
print(f"{student['name']}さん({student['grade']}-{student['class']})")
print(f"趣味: {student['hobby']}")
2. キーと値の対応が重要な場合
国と首都の対応
capitals = {
"日本": "東京",
"アメリカ": "ワシントンD.C.",
"イギリス": "ロンドン",
"フランス": "パリ",
"中国": "北京"
}
# 特定の国の首都を素早く検索
country = "日本"
capital = capitals.get(country, "不明")
print(f"{country}の首都は{capital}です")
組み合わせて使う
より複雑なデータ構造を作るために、リストと辞書を組み合わせることもできます:
1. リストの中に辞書を入れる
# クラスの生徒リスト
students = [
{"name": "山田太郎", "score": 85, "club": "野球部"},
{"name": "鈴木花子", "score": 92, "club": "バスケ部"},
{"name": "佐藤次郎", "score": 78, "club": "サッカー部"}
]
# 各生徒の情報を表示
print("=== 生徒一覧 ===")
for student in students:
print(f"名前: {student['name']}")
print(f"点数: {student['score']}")
print(f"部活: {student['club']}")
print("------------")
2. 辞書の中にリストを入れる
生徒ごとの複数の点数を管理
score_data = {
"山田太郎": [85, 92, 78],
"鈴木花子": [92, 85, 90],
"佐藤次郎": [78, 80, 85]
}
# 各生徒の平均点を計算
print("=== 成績表 ===")
for name, scores in score_data.items():
average = sum(scores) / len(scores)
print(f"{name}の平均点: {average:.1f}")
選択の基準 以下の点を考慮してデータ構造を選びましょう: - 順番は重要? → リスト - 名前で検索したい? → 辞書 - 同じ値を複数持つ? → リスト - キーと値のペアが自然? → 辞書
Q: リストと辞書、どちらを使えばいい? A: 以下の基準で判断しましょう:
リストを使う場合:
- 順番が大切な時(ランキング等)
- 同じ値を複数持つ必要がある時
- 単純な一覧を作る時
辞書を使う場合:
- データに名前を付けたい時
- キーで素早く検索したい時
- 値に意味付けが必要な時
5.6 リスト内包表記でスマートにリストを作る
リスト内包表記(List Comprehension)は、Pythonの強力な機能の1つです。for文を使って書くコードを、より簡潔に書けます。
リスト内包表記の基本
1. 基本的な形
基本的な形
# 通常のfor文での書き方
numbers = []
for i in range(1, 6):
numbers.append(i)
print(numbers) # [1, 2, 3, 4, 5]
# リスト内包表記での書き方
numbers = [i for i in range(1, 6)]
print(numbers) # [1, 2, 3, 4, 5]
2. 計算を含む場合
計算を含む場合
# 1から5までの二乗のリスト
# 通常のfor文
squares = []
for i in range(1, 6):
squares.append(i**2)
print(squares) # [1, 4, 9, 16, 25]
# リスト内包表記
squares = [i**2 for i in range(1, 6)]
print(squares) # [1, 4, 9, 16, 25]
条件を使ったリスト内包表記
1. if 条件を使う
if条件を使う
# 10以下の偶数をリストにする
# 通常のfor文
evens = []
for i in range(11):
if i % 2 == 0:
evens.append(i)
print(evens) # [0, 2, 4, 6, 8, 10]
# リスト内包表記
evens = [i for i in range(11) if i % 2 == 0]
print(evens) # [0, 2, 4, 6, 8, 10]
2. 文字列の処理
文字列の処理
# 文字列の各文字を大文字にする
word = "Python"
# 通常のfor文
upper_chars = []
for char in word:
upper_chars.append(char.upper())
print(upper_chars) # ['P', 'Y', 'T', 'H', 'O', 'N']
# リスト内包表記
upper_chars = [char.upper() for char in word]
print(upper_chars) # ['P', 'Y', 'T', 'H', 'O', 'N']
リスト内包表記の基本形 py [式 for 変数 in イテラブル] [式 for 変数 in イテラブル if 条件]
-
式:各要素に対する処理 - 変数:ループの変数 - イテラブル:繰り返し可能なもの(リスト、range()など) - if
条件:フィルタリングの条件(オプション)
実践的な例
1. 点数のフィルタリング
点数のフィルタリング
scores = [85, 92, 78, 65, 90, 55, 88, 72, 80]
# 80点以上の点数を抽出
high_scores = [score for score in scores if score >= 80]
print("80点以上:", high_scores)
# 不合格(60点未満)の点数を抽出
failed_scores = [score for score in scores if score < 60]
print("不合格:", failed_scores)
2. データの変換
気温データ(摂氏)を華氏に変換
# 気温データ(摂氏)を華氏に変換
celsius = [0, 10, 20, 30, 40]
fahrenheit = [(c * 9/5) + 32 for c in celsius]
for c, f in zip(celsius, fahrenheit):
print(f"{c}°C = {f:.1f}°F")
3. 文字列のリスト処理
文字列のリスト処理
names = ["山田太郎", "鈴木花子", "佐藤次郎"]
# 姓だけ抽出
surnames = [name[:2] for name in names]
print("姓のリスト:", surnames)
# 名前の長さをリスト化
name_lengths = [len(name) for name in names]
print("名前の長さ:", name_lengths)
Q: リスト内包表記は常に使うべき? A: 以下のポイントを考慮しましょう: 1. 簡単な処理なら内包表記 2. 複雑な処理は通常のfor文 3. 可読性を重視する 4. ネストは避ける(二重ループなど)
複雑すぎる例(避けるべき)
複雑で読みにくい例
# 複雑で読みにくい例
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [x for row in matrix for x in row if x % 2 == 0]
# 代わりにこう書く(分かりやすい)
flattened = []
for row in matrix:
for x in row:
if x % 2 == 0:
flattened.append(x)
5.7 リストと辞書を組み合わせて複雑なデータを扱う
実際のプログラムでは、より複雑なデータを扱うことが多くあります。そんな時、リストと辞書を組み合わせることで、柔軟なデータ構造を作ることができます。
基本的な組み合わせ方
1. リストの中に辞書を入れる
生徒のデータリスト
students = [
{
"name": "山田太郎",
"age": 16,
"class": "A"
},
{
"name": "鈴木花子",
"age": 15,
"class": "B"
}
]
# データの表示
for student in students:
print(f"{student['name']} ({student['age']}歳) - {student['class']}組")
2. 辞書の中にリストを入れる
各教科の試験結果
test_results = {
"数学": [85, 92, 78, 90],
"英語": [92, 88, 85, 95],
"国語": [88, 90, 85, 82]
}
# 教科ごとの平均点を計算
for subject, scores in test_results.items():
average = sum(scores) / len(scores)
print(f"{subject}の平均点: {average:.1f}")
より複雑なデータ構造
1. 成績管理システム
生徒の詳細な成績データ
students = [
{
"name": "山田太郎",
"class": "3-A",
"scores": {
"数学": [85, 92, 88],
"英語": [92, 85, 90],
"国語": [88, 85, 92]
}
},
{
"name": "鈴木花子",
"class": "3-A",
"scores": {
"数学": [92, 88, 95],
"英語": [88, 92, 85],
"国語": [90, 85, 88]
}
}
]
# 成績表の表示
for student in students:
print(f"\n=== {student['name']} ({student['class']}) の成績 ===")
for subject, scores in student['scores'].items():
average = sum(scores) / len(scores)
print(f"{subject}: {scores} (平均: {average:.1f})")
2. 商品管理システム
商品データベース
inventory = {
"食品": [
{"name": "りんご", "price": 150, "stock": 25},
{"name": "バナナ", "price": 100, "stock": 18},
{"name": "オレンジ", "price": 120, "stock": 30}
],
"飲料": [
{"name": "水", "price": 100, "stock": 50},
{"name": "お茶", "price": 150, "stock": 35}
]
}
# 在庫状況の確認
for category, items in inventory.items():
print(f"\n=== {category} ===")
for item in items:
print(f"{item['name']}: {item['price']}円 (在庫: {item['stock']}個)")
データ構造設計のポイント 1. データの階層関係を明確にする 2. 検索のしやすさを考慮する 3. データの更新頻度を考える 4. 拡張性を持たせる
3. 図書館蔵書管理システム
図書館の蔵書データ
library = {
"小説": [
{
"title": "雪国",
"author": "川端康成",
"status": [
{"copy_id": "A1", "is_available": True},
{"copy_id": "A2", "is_available": False}
]
}
],
"参考書": [
{
"title": "Python入門",
"author": "情報太郎",
"status": [
{"copy_id": "B1", "is_available": True}
]
}
]
}
# 貸出可能な本を検索
def find_available_books(library):
available_books = []
for category, books in library.items():
for book in books:
# 貸出可能な本があるかチェック
available_copies = [
status for status in book["status"]
if status["is_available"]
]
if available_copies:
available_books.append({
"title": book["title"],
"category": category,
"copies": len(available_copies)
})
return available_books
# 貸出可能な本を表示
available = find_available_books(library)
print("\n=== 貸出可能な本 ===")
for book in available:
print(f"{book['title']} ({book['category']}) - {book['copies']}冊利用可能")
Q: 複雑なデータ構造を設計する時のコツは? A: 以下の点を考慮しましょう: 1. 最もよく検索する項目をキーにする 2. 関連するデータをグループ化する 3. 必要以上に階層を深くしない 4. データの追加・更新のしやすさを考える
4. スポーツ大会の記録管理
スポーツ大会の記録
tournament = {
"バスケットボール": {
"teams": [
{
"name": "赤組",
"members": ["山田", "鈴木", "田中"],
"scores": [45, 52, 38]
},
{
"name": "白組",
"members": ["佐藤", "高橋", "伊藤"],
"scores": [42, 48, 44]
}
],
"dates": ["2024-06-01", "2024-06-02", "2024-06-03"]
}
}
# チームごとの成績を集計
for sport, data in tournament.items():
print(f"\n=== {sport} の記録 ===")
for team in data["teams"]:
total = sum(team["scores"])
average = total / len(team["scores"])
print(f"{team['name']}")
print(f"メンバー: {', '.join(team['members'])}")
print(f"得点: {team['scores']}")
print(f"平均: {average:.1f}")
Ex.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点、...)ごとの人数を集計してみよう
# - 複数の科目の点数を管理してみよう
Ex.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段階)も記録してみよう
まとめ
この章で学んだこと:
- リストは順序付きのデータ集合
- 辞書はキーと値のペアでデータを管理
- それぞれの特徴を活かした使い分けが重要
- リスト内包表記で効率的なコード作成
- 実践的なデータ管理の方法