この章のキーワード
- 辞書型
- 辞書の初期化
- キー
- バリュー
- :と,
- keys()
- リストのリスト
- 辞書のリスト
この章のキーワード
“睦月” ⇒ “1月”、”如月” ⇒ “2月”、”弥生” ⇒ “3月” のように、1対1対応するデータを表すのには 辞書型
の変数を使います。色名を英語に変換する辞書を作ってみましょう。
dic = {}dic["赤"] = "red"dic["青"] = "blue"dic["黄"] = "yellow"
print(dic["赤"])
実行すると「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["赤"])
野菜の値段表を作って価格をすべて足してみます。
nedan = {"白菜":200, "ごぼう":150, "大根":120, "にんじん":80}
goukei = 0for yasai in nedan.keys(): goukei += nedan[yasai]
print(goukei)
実行するとすべての価格が足されて550が表示されます。
550が表示される
辞書型のデータは一度に代入できます。キーと値を :
でくっつけて ,
で区切ります。ここでは野菜の名前と値段のペアをまとめて入力しています。
nedan = {"白菜":200, "ごぼう":150, "大根":120, "にんじん":80}
辞書型変数のメソッド keys()
を用いると、辞書のキーだけを抜き出すことができます。4行目では、for文の中で使うことで、ひとつひとつのキーを取り出して繰り返し処理をしています。
変数 goukei
に野菜の値段をどんどん足していって、総計を出力しています。
goukei = 0for yasai in nedan.keys(): goukei += nedan[yasai]
print(goukei)
色の辞書は、日本語を英語に変換するものでした。これをもとにして、逆に英語から日本語に変換する辞書を作ってください。下のコードでは、日本語を英語に変化する辞書 waei
があります。これを使って、英語を日本語に変換する辞書 eiwa
を作りましょう。たとえば、 eiwa["blue"]
の値が 青
になるようにします。
waei = {"赤":"red", "青":"blue", "黄":"yellow"}
今までに学習したリストPython基礎その3(リスト) と、今回学習した辞書を使うと、複雑なデータを表すことができます。
まずは、リストの中にリストが入る例を見てみましょう。たとえば以下のオセロゲームの盤面をデータで表すと以下のようになります。(実際のオセロは8x8ですが、この図は単純化しています。)
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 で表すことにしましょう。
オセロの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次元リスト と呼ぶこともあります。
いま作ったオセロのデータ、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個がすべて順に出力されます。
dataはリストのリストなので、個々の要素にアクセスするには、まず内側のリストを取り出して、さらにそのリストから要素を取り出す必要があります。
ここでは、まずdataの要素ひとつひとつを取り出し、変数 row
(ロー、英語で行の意味)に入れています。最初の繰り返しでは、dataの最初の要素、 [0, 1, 0, 2, 0]
が row
に入ります。
for row in data:
その下の繰り返しでは、
for item in row: print(item)
さきほどの変数dataを使って、オセロの一番左側の列のデータだけをprintするプログラムを書いてください。
ロールプレイングゲームのモンスターのデータを作ってみましょう。モンスターには、名前と体力と攻撃力があります。モンスターには複数の種類がありますからリストで表すことにします。
monsters = [{"名前":"ゴブリン", "体力":20, "攻撃力":5}, {"名前":"トロール", "体力":50, "攻撃力":8}, {"名前":"魔王", "体力":100, "攻撃力":10}]
print(monsters[1]["名前"])
実行すると「トロール」が出力されます。
モンスターそれぞれには名前や体力や攻撃力などのデータがあります。これらは辞書で表すと便利です。
{"名前":"ゴブリン", "体力":20, "攻撃力":5}
複数のモンスターを並べてリストにします。
monsters = [{"名前":"ゴブリン", "体力":20, "攻撃力":5}, {"名前":"トロール", "体力":50, "攻撃力":8}, {"名前":"魔王", "体力":100, "攻撃力":10}]
monsters[1]
は {"名前":"トロール", "体力":50, "攻撃力":8}
なので、 monsters[1]["名前"]
はトロールになります。
print(monsters[1]["名前"])
さきほど、日本語の色を英語に変換する辞書を作りましたが、今度は英語だけでなくフランス語やドイツ語にも変換できる辞書を作りましょう。辞書 dic3
を作って、たとえば dic3["赤"]["フランス語"]
が「rouge」、 dic3["青"]["ドイツ語"]
が「blau」となるようにしてください。
英語 | フランス語 | ドイツ語 | |
---|---|---|---|
赤 | red | rouge | rot |
青 | blue | bleu | blau |
黄 | yellow | jaune | gelb |
リストを表すのに [ ] { } ( ) と、色々な括弧があって混乱しちゃいますよね。ざっくり言うと、
[ ] ・・・一般的なリストに使われます
{ } ・・・辞書に使われます
( ) ・・・内容を変更できないリスト(タプルと言います)に使われます
となります。
ただし、Pythonでは [ ] ( ) はリスト以外にも使われます。例えば、 [ ] は配列やリストの添字を、( ) は関数の引数を入れるのにも使われます。
混乱してきたら、Chat-GPTやperplexity などのAIで調べてみましょう。例えば、「 Pythonで、[,(,{の使い分けは? 」と質問すればすぐに答えてくれます。