こんにちは、森山です。
前回の第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ではチャレンジと書かれている問題も掲載されていますので、リストや辞書型の復習としてぜひ挑戦してみてください。
最後までお読みいただき、ありがとうございました。
それではまた次回お会いしましょう!
