コンテンツにスキップ

Python基礎その5(辞書と複雑なデータ構造)

この章のキーワード

  • 辞書型
  • 辞書の初期化
  • キー
  • バリュー
  • :と,
  • keys()
  • リストのリスト
  • 辞書のリスト

1.色の英語辞書を作ろう

“睦月” ⇒ “1月”、”如月” ⇒ “2月”、”弥生” ⇒ “3月” のように、1対1対応するデータを表すのには 辞書型 の変数を使います。色名を英語に変換する辞書を作ってみましょう。

dic = {}
dic[""] = "red"
dic[""] = "blue"
dic[""] = "yellow"
print(dic[""])

実行すると「red」が表示されます。

「red」が表示された

「red」が表示された

解説

辞書の初期化

1行目で、辞書型の変数dicを初期化しています。 {} を代入すると空の辞書が作られます。

dic = {}

辞書にデータを入れる

辞書にデータを入れるのにはリストと似たやり方をします。リストと違うのは、インデックスの数字ではなく キー を使うことです。この例では文字をキーに使っていますが、他のデータ型でもかまいません。キーに結びつけられる値のほうは バリュー と呼ばれることがあります。バリュー(Value)はそのまま英語で値という意味です。

dic[""] = "red"
dic[""] = "blue"
dic[""] = "yellow"

中身を見てみる

Pythonでは、printで配列変数名を指定すると、中身を見ることができます。

print(dic)
{'': 'red', '': 'blue', '': 'yellow'\}

このように、辞書は下記の形になっています。

{ **キー0 : 値0** , **キー1 : 値1** , **キー2 : 値2** }

キーで値を取り出す

[] の中にキーを入れると値を取り出すことができます。リストの場合は数字を入れましたが、この場合はキーとして文字を入れています。

print(dic[""])

2.野菜の値段表を作ろう

野菜の値段表を作って価格をすべて足してみます。

nedan = {"白菜":200, "ごぼう":150, "大根":120, "にんじん":80}
goukei = 0
for yasai in nedan.keys():
goukei += nedan[yasai]
print(goukei)

実行するとすべての価格が足されて550が表示されます。

550が表示される

550が表示される

解説

データを一度に代入する

辞書型のデータは一度に代入できます。キーと値を : でくっつけて , で区切ります。ここでは野菜の名前と値段のペアをまとめて入力しています。

nedan = {"白菜":200, "ごぼう":150, "大根":120, "にんじん":80}

keys()でキーがまとめて取得できる

辞書型変数のメソッド keys() を用いると、辞書のキーだけを抜き出すことができます。4行目では、for文の中で使うことで、ひとつひとつのキーを取り出して繰り返し処理をしています。

変数 goukei に野菜の値段をどんどん足していって、総計を出力しています。

goukei = 0
for yasai in nedan.keys():
goukei += nedan[yasai]
print(goukei)

やってみよう1

色の辞書は、日本語を英語に変換するものでした。これをもとにして、逆に英語から日本語に変換する辞書を作ってください。下のコードでは、日本語を英語に変化する辞書 waei があります。これを使って、英語を日本語に変換する辞書 eiwa を作りましょう。たとえば、 eiwa["blue"] の値が になるようにします。

waei = {"":"red", "":"blue", "":"yellow"}

3.複雑なデータ構造:リストのリスト

今までに学習したリストPython基礎その3(リスト) と、今回学習した辞書を使うと、複雑なデータを表すことができます。

まずは、リストの中にリストが入る例を見てみましょう。たとえば以下のオセロゲームの盤面をデータで表すと以下のようになります。(実際のオセロは8x8ですが、この図は単純化しています。)

オセロ.png

data = [[0, 1, 0, 2, 0],
[0, 1, 2, 0, 0],
[0, 2, 2, 0, 0],
[0, 1, 1, 2, 0],
[0, 0, 0, 0, 2]]
print(data[0][1]) # 1が表示される

解説

まずは上の1行目をデータにしてみます。 石がないところは0、黒い石は1、白い石は2 で表すことにしましょう。

オセロ3.png

オセロの1行目をコードで書くとこのようになります。

data1 = [0, 1, 0, 2, 0]

2行目以降もデータにするとこうなります。

data1 = [0, 1, 0, 2, 0]
data2 = [0, 1, 2, 0, 0]
data3 = [0, 2, 2, 0, 0]
data4 = [0, 1, 1, 2, 0]
data5 = [0, 0, 0, 0, 2]

これだと行ごとに変数ができてしまうので、まとめてリストにしましょう。リストを要素にしたリストを作成するとこのようになります。

data = [[0, 1, 0, 2, 0],
[0, 1, 2, 0, 0],
[0, 2, 2, 0, 0],
[0, 1, 1, 2, 0],
[0, 0, 0, 0, 2]]

リスト data の中身はリストです。 data[0] は1番目のリスト、 [0, 1, 0, 2, 0] を示します。なので、 data[0][1][0, 1, 0, 2, 0] の2番めの要素、 1 です。

このように、リストのリストは地図データのような平面のデータを表すのに便利です。 2次元リスト と呼ぶこともあります。

4.複雑なデータ構造:リストのリストその2

いま作ったオセロのデータ、dataの中身をひとつひとつ出力するプログラムを書いてみましょう。

data = [[0, 1, 0, 2, 0],
[0, 1, 2, 0, 0],
[0, 2, 2, 0, 0],
[0, 1, 1, 2, 0],
[0, 0, 0, 0, 2]]
for row in data:
for item in row:
print(item)

実行するとdataの中身25個がすべて順に出力されます。

Untitled

解説

dataはリストのリストなので、個々の要素にアクセスするには、まず内側のリストを取り出して、さらにそのリストから要素を取り出す必要があります。

内側のリストを取り出す

ここでは、まずdataの要素ひとつひとつを取り出し、変数 row (ロー、英語で行の意味)に入れています。最初の繰り返しでは、dataの最初の要素、 [0, 1, 0, 2, 0]row に入ります。

for row in data:

リストから要素を取り出す

その下の繰り返しでは、

for item in row:
print(item)

やってみよう2

さきほどの変数dataを使って、オセロの一番左側の列のデータだけをprintするプログラムを書いてください。

5.複雑なデータ構造:辞書のリスト

ロールプレイングゲームのモンスターのデータを作ってみましょう。モンスターには、名前と体力と攻撃力があります。モンスターには複数の種類がありますからリストで表すことにします。

monsters = [{"名前":"ゴブリン", "体力":20, "攻撃力":5},
{"名前":"トロール", "体力":50, "攻撃力":8},
{"名前":"魔王", "体力":100, "攻撃力":10}]
print(monsters[1]["名前"])

実行すると「トロール」が出力されます。

Untitled

解説

モンスターのデータを辞書で表す

モンスターそれぞれには名前や体力や攻撃力などのデータがあります。これらは辞書で表すと便利です。

{"名前":"ゴブリン", "体力":20, "攻撃力":5}

モンスターを配列にする

複数のモンスターを並べてリストにします。

monsters = [{"名前":"ゴブリン", "体力":20, "攻撃力":5},
{"名前":"トロール", "体力":50, "攻撃力":8},
{"名前":"魔王", "体力":100, "攻撃力":10}]

リストの中の辞書にアクセスする

monsters[1]{"名前":"トロール", "体力":50, "攻撃力":8} なので、 monsters[1]["名前"] はトロールになります。

print(monsters[1]["名前"])

まとめ課題

さきほど、日本語の色を英語に変換する辞書を作りましたが、今度は英語だけでなくフランス語やドイツ語にも変換できる辞書を作りましょう。辞書 dic3 を作って、たとえば dic3["赤"]["フランス語"] が「rouge」、 dic3["青"]["ドイツ語"] が「blau」となるようにしてください。

英語フランス語ドイツ語
redrougerot
bluebleublau
yellowjaunegelb

調べてみよう

リストを表すのに [ ] { } ( ) と、色々な括弧があって混乱しちゃいますよね。ざっくり言うと、

[ ] ・・・一般的なリストに使われます

{ } ・・・辞書に使われます

( ) ・・・内容を変更できないリスト(タプルと言います)に使われます

となります。

ただし、Pythonでは [ ] ( ) はリスト以外にも使われます。例えば、 [ ] は配列やリストの添字を、( ) は関数の引数を入れるのにも使われます。

混乱してきたら、Chat-GPTperplexity などのAIで調べてみましょう。例えば、「 Pythonで、[,(,{の使い分けは? 」と質問すればすぐに答えてくれます。