09 / 90

Day 09: リスト、辞書、頻度の集計、安全な Git の回復

新しい内容:リストと辞書、文字の頻度の集計(空・繰り返し・Unicode コードポイントの場合)、未コミットの編集の破棄とコミット済みの変更の取り消し(revert)の違い、そしてテキスト統計の独立実装。間隔をあけた復習として Day 08 の不変条件と Day 05 のエイリアスを再利用する。

自律学習と Python 480 分(8 時間の集中学習)
01 120 分

リストと辞書:順序付きの要素とキーと値による集計

エージェント支援の演習:まず自分の予測と実際の出力を記録すること。その後に限り AI エージェントに説明やレビューを頼んでよく、受けた支援は証拠に必ず記録する。

前提条件

Day 08(独立チェックを含む)を修了していること。回復先:Day 08(ループと不変条件)、Day 07 活動 1(変更と再束縛)。このブロックの復習日は Day 07。

学習目標

リストと辞書を作って更新し、所属を調べ、存在しないキーを get で安全に読み、2 つの名前が同じリストを指すときのエイリアスを、空や Unicode の場合も含めて予測する。

手順

参照資料: この活動に割り当てられた既存の読解・練習時間内で、Automate the Boring Stuff with Python, 3rd edition の Chapter 6; Practice Questions; Appendix B answers を参照し、ローカル課題とのつながりを一つ自分の言葉で説明する。既存の演習と合格基準は維持し、外部資料が開けない場合は本コース独自の説明を使う。間隔をあけた復習のウォームアップ: Day 08 の数える処理の不変条件を記憶から述べ、a = [1]; b = a; a.append(2) で b が変わる理由を説明する。今日はリストで同じエイリアスを見る。

新しい考え方: list(text) はコードポイントのリストを返す。リストは要素の順序を保ち、append は末尾に追加する。辞書はキーを値に対応づける。d[key] = value は追加または置き換え、key in d はキーの有無を調べ、d.get(key, 0) はキーがないときに失敗せず 0 を返す。辞書は挿入した順序を覚えている。

出力される各行を予測してから実行する:

chars = list("ñu猫")
print(chars, len(chars))
print(len("n\u0303u"), "n\u0303u" == "ñu")
seen = []
for ch in "abca":
    if ch not in seen:
        seen.append(ch)
print(seen)
ages = {}
ages["猫"] = 3
ages["犬"] = 5
ages["猫"] = ages["猫"] + 1
print(ages, len(ages), "猫" in ages, ages.get("鳥", 0))
alias = seen
alias.append("z")
print(seen)
print(list(""), {})

演習と予測記録

出力される 6 行すべての予測を書き、実際の出力を記録する。len("n\u0303u") が 3 になる理由、seen に各文字の最初の出現だけが残る理由、alias を通した append が seen も変える理由を説明する。

独立習得基準

6 行すべてを実行前に予測し、食い違いをそれぞれ説明している。デフォルト付きの get、挿入順序、分解形の文字の長さ、リストのエイリアスを説明できる。

出典リソースと来歴

linking Copyright Al Sweigart; edition-specific reuse terms unverified linking only; no reproduction

Automate the Boring Stuff with Python, 3rd edition

著者・提供機関: Al Sweigart | オリジナル出所URL ↗

該当セクション・タイムスタンプ: Chapter 6; Practice Questions; Appendix B answers

検証バージョンと日付: Public edition checked 2026-11-01; moving pages may change

選定理由:

Beginner teaching and answer-keyed practice before checking exact semantics in the Python reference; selected chapters only, not the book's entire automation stack.

ソース前提知識:

No prior programming required for Chapter 1; later chapters assume its basic Python concepts.

安全フォールバック(オフライン回復性):

Use the original localized explanations, exercises and checks already present in this activity; no external account or purchase is required for that fallback.

比較対象候補リソースと選定評価 (2)
The Python Tutorial ↗ compared_alternative [PSF License Version 2]

Guided Python syntax but assumes programming familiarity; paired with the beginner text rather than used as its replacement.

MIT OCW 6.0001 ↗ compared_alternative [CC BY-NC-SA 4.0]

Lectures and problem sets teach a broader CS1 course; the book offers shorter text-first entry and an answer appendix.

linking PSF License Version 2

The Python Tutorial: More Control Flow Tools

著者・提供機関: Python Software Foundation | オリジナル出所URL ↗

該当セクション・タイムスタンプ: 第 4.2〜4.10 節(for、range、関数の定義)。データ構造は同じチュートリアルの第 5 章

検証バージョンと日付: Python 3.12 ドキュメント(確認日: 2026-10-30)

選定理由:

Python の反復処理、関数、コンテナを確認するための一次資料。

ソース前提知識:

Day 01〜06 の Python の式とファイルシステムの基礎

安全フォールバック(オフライン回復性):

必要な動作はすべて教材内で説明しているため、オフラインでも完了できます。

比較対象候補リソースと選定評価 (2)
The Python Language Reference: Compound statements ↗ compared_alternative [PSF License Version 2]

同じ構文を文法レベルで定義するリファレンスです。段階を追って学べる構成のため、チュートリアルの章を選びました。

同じ制御フローを講義のペースで扱う教材です。本カリキュラムではターミナルでの演習を通じて概念を扱っているため、採用を見送りました。

02 120 分

辞書による頻度の集計とその不変条件

エージェント支援の演習:まず自分の予測と実際の出力を記録すること。その後に限り AI エージェントに説明やレビューを頼んでよく、受けた支援は証拠に必ず記録する。

前提条件

今日の活動 1。回復先:Day 08 活動 1(数える処理の不変条件)、今日の活動 1(辞書の get)。

学習目標

char_frequencies(text) と most_common(counts) を実装し、辞書の不変条件を述べ、空・繰り返し・大文字小文字の区別・絵文字・分解形 Unicode の入力をコードポイント単位でテストする。

手順

参照資料: この活動に割り当てられた既存の読解・練習時間内で、Automate the Boring Stuff with Python, 3rd edition の Chapter 7; Practice Questions; Appendix B answers を参照し、ローカル課題とのつながりを一つ自分の言葉で説明する。既存の演習と合格基準は維持し、外部資料が開けない場合は本コース独自の説明を使う。間隔をあけた復習: Day 08 の 1 つのカウンターを、異なる文字ごとに 1 つのカウンターへと一般化する。

不変条件: 各反復の開始時、counts はこれまでに訪れた各コードポイントをその出現回数に対応づけ、値の合計は訪れたコードポイントの数に等しい。most_common はこれまでで最も多い文字を保持する。厳密に大きい数のときだけ置き換えるので、同数なら先に現れた文字が残る。

実行前に各行を予測し、"banana" のトレース表(ch / counts)を書く:

def char_frequencies(text):
    counts = {}
    for ch in text:
        counts[ch] = counts.get(ch, 0) + 1
    return counts
def most_common(counts):
    best_char = None
    best_count = 0
    for ch in counts:
        if counts[ch] > best_count:
            best_char = ch
            best_count = counts[ch]
    return best_char
print(char_frequencies(""))
print(char_frequencies("banana"))
print(char_frequencies("猫猫犬"))
print(char_frequencies("aA"))
print(char_frequencies("😀😀"))
print(char_frequencies("e\u0301") == {"e": 1, "\u0301": 1})
print(most_common(char_frequencies("banana")))
print(most_common(char_frequencies("abab")))
print(most_common(char_frequencies("")))

演習と予測記録

char_frequencies("banana") のトレース表、出力される 9 行すべての予測と観察、そして "aA" でキーが 2 つになる理由、"😀😀" で数が 2 になる理由、空文字列で {} と None になる理由をそれぞれ 1 文で提出する。

独立習得基準

トレース表が参考と一致し、9 行すべてを予測するか食い違いを説明し、辞書の不変条件と同数のときの規則を述べ、空・繰り返し・大文字小文字・Unicode のケースを正しく扱っている。

出典リソースと来歴

linking Copyright Al Sweigart; edition-specific reuse terms unverified linking only; no reproduction

Automate the Boring Stuff with Python, 3rd edition

著者・提供機関: Al Sweigart | オリジナル出所URL ↗

該当セクション・タイムスタンプ: Chapter 7; Practice Questions; Appendix B answers

検証バージョンと日付: Public edition checked 2026-11-01; moving pages may change

選定理由:

Beginner teaching and answer-keyed practice before checking exact semantics in the Python reference; selected chapters only, not the book's entire automation stack.

ソース前提知識:

No prior programming required for Chapter 1; later chapters assume its basic Python concepts.

安全フォールバック(オフライン回復性):

Use the original localized explanations, exercises and checks already present in this activity; no external account or purchase is required for that fallback.

比較対象候補リソースと選定評価 (2)
The Python Tutorial ↗ compared_alternative [PSF License Version 2]

Guided Python syntax but assumes programming familiarity; paired with the beginner text rather than used as its replacement.

MIT OCW 6.0001 ↗ compared_alternative [CC BY-NC-SA 4.0]

Lectures and problem sets teach a broader CS1 course; the book offers shorter text-first entry and an answer appendix.

linking PSF License Version 2

The Python Tutorial: More Control Flow Tools

著者・提供機関: Python Software Foundation | オリジナル出所URL ↗

該当セクション・タイムスタンプ: 第 4.2〜4.10 節(for、range、関数の定義)。データ構造は同じチュートリアルの第 5 章

検証バージョンと日付: Python 3.12 ドキュメント(確認日: 2026-10-30)

選定理由:

Python の反復処理、関数、コンテナを確認するための一次資料。

ソース前提知識:

Day 01〜06 の Python の式とファイルシステムの基礎

安全フォールバック(オフライン回復性):

必要な動作はすべて教材内で説明しているため、オフラインでも完了できます。

比較対象候補リソースと選定評価 (2)
The Python Language Reference: Compound statements ↗ compared_alternative [PSF License Version 2]

同じ構文を文法レベルで定義するリファレンスです。段階を追って学べる構成のため、チュートリアルの章を選びました。

同じ制御フローを講義のペースで扱う教材です。本カリキュラムではターミナルでの演習を通じて概念を扱っているため、採用を見送りました。

03 120 分

安全な Git の回復:未コミットの編集を復元し、コミット済みの変更を revert する

エージェント支援の演習:まず自分の予測と実際の出力を記録すること。その後に限り AI エージェントに説明やレビューを頼んでよく、受けた支援は証拠に必ず記録する。

前提条件

今日の活動 1〜2、Git がインストール済みであること。回復先:Day 07 活動 3 と Day 08 活動 3(git restore)。

学習目標

使い捨てリポジトリで、状況ごとに正しい安全な道具を選ぶ:未コミットの編集には git restore(または保存したコピー)、コミット済みの変更には git revert --no-edit HEAD。それぞれの結果を確かめる。

手順

間隔をあけた復習: パート A は Day 07〜08 の git restore の手順を今日の頻度ファイルで繰り返す。

新しい考え方: git revert は以前のコミットを打ち消す新しいコミットを作るので、履歴は書き換えられずに残る。対象はコミット済みの変更だけで、作業ツリーの該当ファイルに未コミットの変更があると実行を拒否する。だからこそ、ベースラインをコミットし、未コミットの編集をしてから git revert を試す、という手順を取ってはいけない。

パートごとに新しい一時ディレクトリを使い、出力はすべて先に予測する。

パート A:未コミットの編集を Git で復元する

cd "$(mktemp -d)"
git init -q
git config user.name "Learner"
git config user.email "[email protected]"
cat > freq.py <<'EOF'
def char_frequencies(text):
    counts = {}
    for ch in text:
        counts[ch] = counts.get(ch, 0) + 1
    return counts
print(char_frequencies("猫猫犬"))
EOF
git add freq.py
git commit -q -m "Add char_frequencies"
python3 freq.py
printf 'print(char_frequencies(""))\n' >> freq.py
git status --short
python3 freq.py
git restore freq.py
git status --short
python3 freq.py

パート A の別法:保存したコピー(回復に Git コマンドは不要)

cd "$(mktemp -d)"
git init -q
git config user.name "Learner"
git config user.email "[email protected]"
cat > freq.py <<'EOF'
def char_frequencies(text):
    counts = {}
    for ch in text:
        counts[ch] = counts.get(ch, 0) + 1
    return counts
print(char_frequencies("猫猫犬"))
EOF
git add freq.py
git commit -q -m "Add char_frequencies"
python3 freq.py
cp freq.py freq.py.saved
printf 'oops\n' >> freq.py
cp freq.py.saved freq.py
rm freq.py.saved
git status --short
python3 freq.py

パート B:コミット済みの変更を新しいコミットで revert する

cd "$(mktemp -d)"
git init -q
git config user.name "Learner"
git config user.email "[email protected]"
cat > freq.py <<'EOF'
def char_frequencies(text):
    counts = {}
    for ch in text:
        counts[ch] = counts.get(ch, 0) + 1
    return counts
print(char_frequencies("猫猫犬"))
EOF
git add freq.py
git commit -q -m "Add char_frequencies"
python3 freq.py
printf 'print("debug")\n' >> freq.py
git commit -q -am "Add debug print"
python3 freq.py
git revert --no-edit HEAD > /dev/null
git log --format=%s
git diff HEAD~2 HEAD
git status --short
python3 freq.py

パート C:順序が重要な理由:未コミットの編集があると git revert が拒否されることを示す。

cd "$(mktemp -d)"
git init -q
git config user.name "Learner"
git config user.email "[email protected]"
cat > freq.py <<'EOF'
def char_frequencies(text):
    counts = {}
    for ch in text:
        counts[ch] = counts.get(ch, 0) + 1
    return counts
print(char_frequencies("猫猫犬"))
EOF
git add freq.py
git commit -q -m "Add char_frequencies"
python3 freq.py
printf 'print("debug")\n' >> freq.py
git commit -q -am "Add debug print"
printf 'oops\n' >> freq.py
git revert --no-edit HEAD 2> /dev/null || echo "revert refused: uncommitted change present"
git status --short

演習と予測記録

各パートについて予測と実際の出力を記録する。そのうえで答える:未コミットの編集を取り消すコマンドはどれか、コミット済みの変更を取り消すコマンドはどれか、それぞれの回復が成功したことを何が証明するか、パート C で git revert が拒否した理由は何か。Unicode を含む出力 {'猫': 2, '犬': 1} は、変更前と回復後で同一でなければならない。

独立習得基準

3 つのパートすべてで使い捨てリポジトリ上で参考出力を再現し、未コミットの編集には git restore または保存したコピー、コミット済みの変更には git revert --no-edit HEAD を正しく対応させ、それぞれの確認方法を示し、パート C の拒否を説明している。

出典リソースと来歴

linking PSF License Version 2

The Python Tutorial: More Control Flow Tools

著者・提供機関: Python Software Foundation | オリジナル出所URL ↗

該当セクション・タイムスタンプ: 第 4.2〜4.10 節(for、range、関数の定義)。データ構造は同じチュートリアルの第 5 章

検証バージョンと日付: Python 3.12 ドキュメント(確認日: 2026-10-30)

選定理由:

Python の反復処理、関数、コンテナを確認するための一次資料。

ソース前提知識:

Day 01〜06 の Python の式とファイルシステムの基礎

安全フォールバック(オフライン回復性):

必要な動作はすべて教材内で説明しているため、オフラインでも完了できます。

比較対象候補リソースと選定評価 (2)
The Python Language Reference: Compound statements ↗ compared_alternative [PSF License Version 2]

同じ構文を文法レベルで定義するリファレンスです。段階を追って学べる構成のため、チュートリアルの章を選びました。

同じ制御フローを講義のペースで扱う教材です。本カリキュラムではターミナルでの演習を通じて概念を扱っているため、採用を見送りました。

04 120 分

テキスト統計の独立実装

独立習得チェック:証拠を提出するまで AI の支援も参考解答も使わない。受けた支援は正直に申告する。

前提条件

今日の活動 1〜3 を証拠付きで終えていること。回復先:活動 2(頻度)、Day 08 活動 2(関数の契約)、Day 07(条件の復習)。

学習目標

支援なしで、コードポイント単位の長さ、異なるコードポイントの数、頻度の辞書、最も多いコードポイントを報告する text_stats(text) を実装する。空・繰り返し・Unicode のテキストで正しく動き、繰り返し呼び出しても安全であること。

手順

間隔をあけた復習: Day 08 のループ不変条件と関数に、今日の辞書を組み合わせる。証拠を提出するまで参考解答を開かず、AI も使わない。

text_stats(text) の仕様(ちょうど次のキーを持つ辞書を返す):
- "code_points":text に含まれる Unicode コードポイントの数(len(text))。
- "distinct":異なるコードポイントの数。
- "frequencies":各コードポイントからその出現回数への辞書(最初に現れた順)。
- "most_common":出現回数が最も多いコードポイント。同数なら先に現れたもの。空のテキストでは None。
Unicode のコードポイントを厳密に数える:大文字小文字の同一視も正規化もしないので、"e\u0301" は 2 コードポイントである。呼び出しごとに新しい状態から始めること。

コードを書く前に、""、"abca"、"😀😀a"、"naïve naïve" の結果全体と、"e\u0301" の code_points、distinct、most_common の値を予測する。それから実装してテストし、最後に頻度を数えるループと最多を選ぶループそれぞれの不変条件を書く。

演習と予測記録

提出物:5 つの入力すべての予測、text_stats のコード、実際の出力、text_stats("abca") を 2 回呼んで等しい結果になることの確認、2 つの不変条件。食い違いごとに見直す回復先の活動を書く。

独立習得基準

支援なしで:text_stats が空・繰り返し・絵文字・アクセント付き・分解形のテキストを含む 5 つの入力すべてでコードポイント単位の参考出力と一致し、繰り返し呼び出しの結果が等しく、2 つの不変条件を正しく述べ、食い違いごとに回復先の活動を書いている。

出典リソースと来歴

linking PSF License Version 2

The Python Tutorial: More Control Flow Tools

著者・提供機関: Python Software Foundation | オリジナル出所URL ↗

該当セクション・タイムスタンプ: 第 4.2〜4.10 節(for、range、関数の定義)。データ構造は同じチュートリアルの第 5 章

検証バージョンと日付: Python 3.12 ドキュメント(確認日: 2026-10-30)

選定理由:

Python の反復処理、関数、コンテナを確認するための一次資料。

ソース前提知識:

Day 01〜06 の Python の式とファイルシステムの基礎

安全フォールバック(オフライン回復性):

必要な動作はすべて教材内で説明しているため、オフラインでも完了できます。

比較対象候補リソースと選定評価 (2)
The Python Language Reference: Compound statements ↗ compared_alternative [PSF License Version 2]

同じ構文を文法レベルで定義するリファレンスです。段階を追って学べる構成のため、チュートリアルの章を選びました。

同じ制御フローを講義のペースで扱う教材です。本カリキュラムではターミナルでの演習を通じて概念を扱っているため、採用を見送りました。