放課後Pythonラボ 第11時限目 辞書とリストを組み合わせて複雑なデータを作ってみよう

こんにちは、森山です。

前回の第10時限目では、番号ではなく「キー(目印)」でデータを管理する「辞書型(dict型)」について学びましたね。

辞書型を使うと、

student = {
    "名前": "田中",
    "学年": 1,
    "部活": "野球部"
}

のように、意味のある名前を付けてデータを管理できるようになります。
また、第9時限目ではリスト型で「リスト内包表記」という便利な書き方を学びました。

実は辞書型にも、同じようにデータをまとめて作れる「辞書内包表記」というものがあります。

今回はまずリスト内包表記と辞書内包表記を比較し、その後で『ハイスクールPython』の5.7でも紹介されている「リスト型と辞書型を組み合わせたデータ」に挑戦してみましょう。

この考え方を覚えると、少し複雑なプログラムも作れるようになってきます。


リスト内包表記と辞書内包表記

まずは、第9時限目で学んだリスト内包表記を思い出してみましょう。

リスト内包表記は次のように書きます。

[処理 for 変数 in イテラブル]

※ イテラブルとは、リストや range() のように繰り返し取り出せるデータのことです。

例えば、0から4までの数字を2乗したリストを作る場合は、

squares_list = [x ** 2 for x in range(5)]
print(squares_list)

実行結果は

[0, 1, 4, 9, 16]

となります。

リスト内包表記は、「値の一覧」を作ることができる書き方でした。

では辞書型の場合はどうなるのでしょうか。
辞書内包表記は次のように書きます。

{キー: 値 for 変数 in イテラブル}

先ほどと同じデータを辞書型で作ると、

squares_dict = {x: x ** 2 for x in range(5)}
print(squares_dict)

実行結果は

{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

となります。

リスト内包表記では「値だけ」を並べるのに対し、辞書内包表記は「キーと値の組み合わせ」を一度に作れるのが特徴です。

学校のテスト結果に当てはめて考えてみましょう。

例えば、

scores = [78, 92, 85]

とリストで作る場合はこうなりますが、これではどの点数がどの科目なのかはわかりません。
単純に平均点を計算するだけであれば、リスト型でも十分に扱うことができます。

しかし、

「数学の点数を知りたい」
「英語だけ点数を更新したい」
「国語と数学の点数を比較したい」

といった場合はこの型では少し不便です。

そこで辞書型を使うと、

scores = {
    "国語": 78,
    "数学": 92,
    "英語": 85
}

このように、科目名と点数をセットで管理することができます。

数学の点数を取り出したい場合は、

print(scores["数学"])

と書くだけです。

リスト型が「順番」でデータを管理するのに対し、辞書型は「名前」でデータを管理できるので、作りたいプログラムに合わせて型を使い分けましょう。

そして今回は「リスト型と辞書型を組み合わせるとどんなことができるのか」について学んでいきたいと思います。


リスト型と辞書型を組み合わせてみよう

実際のプログラムでは、リスト型や辞書型など複数のデータ型を組み合わせて使うことがよくあります。

このような複数のデータ型を組み合わせる考え方は、機械学習の分野でもよく使われています。
AIに「これは猫です」「これは亀です」と判断させるためには、それぞれの動物がどのような特徴を持っているのかを、データとして学習させる必要があります。

例えばAIに動物の特徴を学習させるにはどんなデータを作れば良いか考えてみましょう。
それぞれの動物の特徴を整理したデータが必要そうですね。

「動物」というカテゴリーの中に複数の動物の特徴を入れたデータを作る時に、リスト型と辞書型を組み合わせると、それぞれの動物ごとの特徴を管理するデータを作ることができます。

このような書き方になります。

animal_features = {
    "猫": [
        "哺乳類",
        "夜行性",
        "肉食動物",
        "ひげがある",
        "肉球がある"
    ],
    "亀": [
        "爬虫類",
        "変温動物",
        "甲羅がある",
        "歯がない",
        "長寿"
    ],
    "ニワトリ": [
        "鳥類",
        "卵を産む",
        "羽がある",
        "くちばしがある",
        "キジ科"
    ]
}

実際の機械学習では、何百個、何千個もの特徴を扱うこともありますが、今回は仕組みを理解するために、動物ごとにいくつかの特徴だけを入れたデータを作りました。

このデータでは、

  • キー → 動物の名前
  • 値 → 特徴のリスト

になっています。

機械学習やデータ分析では、このように「分類したいもの」と「特徴の一覧」をセットで管理することがあります。

辞書型だけでも複数の特徴を保存できますが、特徴の数が増えると管理が大変になります。

そこで、辞書型とリスト型を組み合わせることで、わかりやすくデータを整理することができるのです。

※実際にはコンピューターは「猫」や「哺乳類」といった文字をそのまま理解しているわけではなく、これらの情報を数値に変換して学習していますが、今回は仕組みをイメージしやすいように、文字で特徴を表現しています。


データを取り出してみよう

それでは猫の特徴一覧を取り出してみます。

cat_features = animal_features["猫"]
print(cat_features)

実行結果

['哺乳類', '夜行性', '肉食動物', 'ひげがある', '肉球がある']

このようにリストで猫の特徴を取り出すことができます。
もちろんリストなので、その中の1つだけを取り出すこともできます。

cat_feature = animal_features["猫"][2]
print(cat_feature)

どの値が出力されるのか、実際にGoogle Colabで実行して確認してみてください。


ここがポイント!

これは学校の図書室にある本棚をイメージするとわかりやすいと思います。

まず animal_features["猫"] で、「猫」というラベルの付いた本棚を探します。
すると、その棚には

['哺乳類', '夜行性', '肉食動物', 'ひげがある', '肉球がある']

という特徴が順番に並んでいます。順番を持っているので「何番目」の特徴という取り出し方ができるのです。


二次元リストとの違い

第8時限目や第9時限目では、リストの中にリストが入った「二次元リスト」を学びました。

例えば、動物の特徴を二次元リストで表現すると、

animal_data = [
    ["猫", "哺乳類", "夜行性", "肉食動物", "ひげがある", "肉球がある"],
    ["亀", "爬虫類", "変温動物", "甲羅がある", "歯がない", "長寿"],
    ["ニワトリ", "鳥類", "卵を産む", "羽がある", "くちばしがある", "キジ科"]
]

のようになります。
この場合、

animal_data[0]

と書けば猫のデータを取り出せますが、「0番目が猫」ということを覚えておかなければなりません。

一方、今回学んだ辞書型とリスト型を組み合わせたデータなら、

animal_features["猫"]

と書くだけで猫の特徴を取り出せます。

今回は3種類の動物だけなので番号でも管理はできます。しかし、これが100種類、1000種類の動物になったらどうでしょうか。

「0番目が猫、1番目が亀、2番目がニワトリ…」

と覚えておくのは大変ですよね。
管理するデータが増えてくると、番号だけで管理するよりも「名前」で管理した方がわかりやすくなります。

そのため、実際のプログラムでは二次元リストだけでなく、今回のように辞書型とリスト型を組み合わせたデータもよく使われています。


「順番」と「名前」をマスターして、データの整理術を磨こう

今回は、

  • 辞書内包表記
  • リスト型と辞書型の組み合わせ
  • 辞書の中にあるリストへのアクセス方法

について学びました。

最初は少し複雑に見えるかもしれませんが、このようなデータ構造は機械学習だけでなく、ゲームやWebシステムなど、実際のプログラムでもよく使われています。

リスト型は「順番」で管理するのに適していて、辞書型は「名前」で管理するのに適しています。
そして、それぞれを組み合わせることで、より複雑な情報を整理できるようになります。
リスト型や辞書型を学んだことで、if文やfor文などと組み合わせてできることが増えてきましたね。

ハイスクールPythonの5.7でも色々なデータを扱ったプログラムが紹介されています。
また、Ex.1と2ではチャレンジと書かれている問題も掲載されていますので、リストや辞書型の復習としてぜひ挑戦してみてください。

最後までお読みいただき、ありがとうございました。
それではまた次回お会いしましょう!

PAGE TOP