Paiza Python入門編5: 辞書(ディクショナリ)の基礎

PaizaでPython3が完全無料なのでまとめました。

<a href="https://paiza.jp/works/python3/primer">Paiza Python3入門編


##01:辞書とは何か学ぼう

```lesson.py
まとまったデータをテキスト(キー)で扱う

リスト
list 012に対し

list[0]="モンスター"
list[1]="ドラゴン"
list[2]="魔王"

辞書

dict 　ザコ　中ボス　ラスボス

dict["ザコ"]="モンスター"
dict["中ボス"]="ドラゴン"
dict["ラスボス"]="魔王"

というようにできる

辞書な基本機能

enemies ザコ　中ボス　ラスボス

キーでデータを参照
print(enemies["ザコ"])

キーを変数を求める
level="中ボス"
print(enemies[level])

データの個数
print(len(enemies))

追加、更新、削除もできる

辞書の使い所
1.DBとやりとりするデータの処理
点数一覧のデータ(縦列)→リストで処理
国語の点数

2.APIとやりとりするデータの処理
学生のレコード(横列)→辞書(ディクショナリ)で処理
出席番号、国語、算数、英語

```

##02辞書を作る

```lesson.py
# リストのおさらい
enemyArray=["スライム","モンスター","ドラゴン"]
print(enemyArray)
print(enemyArray[0])

#辞書の具体例
enemyDictionary= {"ザコ":"スライム","中ボス":"ドラゴン","ラスボス":"魔王"}
print(enemyDictionary)
print(enemyDictionary["ザコ"])
print(enemyDictionary["中ボス"])

level= "ザコ"
print(enemyDictionary[level])

level="ラスボス"
print(enemyDictionary[level])

#存在しないものはエラーになる
#print(enemyDictionary["敵"])

```

```lesson.py
print(enemyArray)
['スライム', 'モンスター', 'ドラゴン']
print(enemyArray[0])
スライム
print(enemyDictionary)
{'ザコ': 'スライム', '中ボス': 'ドラゴン', 'ラスボス': '魔王'}
print(enemyDictionary["ザコ"])
スライム
print(enemyDictionary["中ボス"])
ドラゴン
level= "ザコ"
スライム
level="ラスボス"
魔王
```

##演習

1.指定の文字を辞書にしてみよう

```lesson.py
skills = {"職業":"戦士", "体力":100, "魔法力":200,"ゴールド":380}

print(skills)

```

2.ハッシュの中身を確認してみよう

```lesson.py

skills = {"職業":"戦士", "体力":100, "魔法力":200, "ゴールド":380}
# この下で、辞書を出力してみよう
print(skills)


```

3.辞書の特定の値を出力してみよう

```lesson.py

skills = {"職業":"戦士", "体力":100, "魔法力":200, "ゴールド":380}
# この下で、辞書から出力してみよう
print(skills["職業"])

```

##03:辞書の基本操作

```lesson.py

# 辞書の基本操作
enemies = {"ザコ":"スライム", "中ボス":"ドラゴン", "ラスボス":"魔王"}
print(enemies)
print(enemies["ザコ"])
print(enemies["中ボス"])

#辞書の個数を出すことができる
print(len(enemies))

#辞書に追加することができる
enemies["ザコ２"]="メタルモンスター"
print(enemies)
print(len(enemies))

#値の変更
enemies["中ボス"]="レッドドラゴン"
print(enemies)
print(len(enemies))

#値の削除
del enemies["ザコ"]
print(enemies)
print(len(enemies))

```

##演習

1.辞書の長さを出力してみよう

```lesson.py
skills = {"職業":"戦士", "体力":100, "魔法力":200, "ゴールド":380}
# この下で、辞書の長さを出力してみよう
print(len(skills))

```

2.辞書の要素を追加しよう

```lesson.py

skills = {"職業":"戦士", "体力":100, "魔法力":200, "ゴールド":380}
# この下で、辞書にデータを追加してみよう

skills["属性"]="炎"
print(skills)

```

3.辞書の要素を更新しよう

```lesson.py

skills = {"職業":"戦士", "体力":100, "魔法力":200, "ゴールド":380}
print(skills)
# この下で、ハッシュを更新してみよう
skills["職業"]="魔法使い"
print(skills)

```

4.辞書の要素を削除しよう

```lesson.py

skills = {"体力" : 100,"職業" : "戦士",  "魔法力" : 200, "ゴールド" : 380}
print(skills)
# この下で、辞書を削除してみよう
del skills["体力"]
print(skills)

```

##04:辞書をループ処理する

```lesson.py

# 辞書のおさらい
enemies = {"ザコ":"スライム", "中ボス":"ドラゴン", "ラスボス":"魔王"}
print(enemies)
print(enemies["ザコ"])
print(enemies["中ボス"])

#ループ処理
for rank in enemies:
    print(enemies[rank] + "が、あらわれた!")
    
#辞書のキーと値をペアで取り出すにはitemsメゾットを使う
for (rank,enemy) in enemies.items():
    print(rank + "の" + enemy + "が、あらわれた!")
    
```

##演習

1.ループで辞書の値を出力しよう

```lesson.py
skills = {"職業" : "戦士", "体力" : 100, "魔法力" : 200, "ゴールド" : 380}
# この下で、辞書の値をループで出力してみよう
for i in skills:
    print(skills[i])
```

2.ループで辞書のキーと値を出力しよう

```lesson.py

skills = {"職業" : "戦士", "体力" : 100, "魔法力" : 200, "ゴールド" : 380}
# この下で、ハッシュの値をループで出力してみよう
for(key,item) in skills.items():
    print(key + "は" + str(item) + "です")
    
```

3.ループで合計を計算しよう

```lesson.py

points = {"国語" : 70, "算数" : 35, "英語" : 52}
sum = 0
# この下で、辞書の値の合計をループで計算してみよう

for key in points:
    sum +=points[key]
print(sum)

```

##05:リストの整列

```lesson.py

# リストの整列

weapons=["イージスソード","ウィンドスピア","アースブレイカー","イナズマハンマー"]

print(weapons)

#アイウエオ順
print(sorted(weapons))

#アイウエオ順の反対
print(sorted(weapons,reverse=True))

wepons2=["4.イージスソード","1.ウィンドスピア","3.アースブレイカー","2.イナズマハンマー"]

#数字>アイウエオ順になる
print(sorted(wepons2))


wepons3=["4.イージスソード","1ウィンドスピア","1アースブレイカー","2.イナズマハンマー"]

#同じ数があった場合、アイウエオ順が優先される
print(sorted(wepons3))



wepons4=["バーニングソード","風神スピア","大地ブレイカー","稲妻ハンマー"]

#漢字やカタカナが混じっているときは注意!ソートされない時がある
print(sorted(wepons4))

```


```lesson.py
['イージスソード', 'ウィンドスピア', 'アースブレイカー', 'イナズマハンマー']
['アースブレイカー', 'イナズマハンマー', 'イージスソード', 'ウィンドスピア']
['ウィンドスピア', 'イージスソード', 'イナズマハンマー', 'アースブレイカー']
['1.ウィンドスピア', '2.イナズマハンマー', '3.アースブレイカー', '4.イージスソード']
['1アースブレイカー', '1ウィンドスピア', '2.イナズマハンマー', '4.イージスソード']
['バーニングソード', '大地ブレイカー', '稲妻ハンマー', '風神スピア']
````


##演習
1.リストを逆順にソートする

```lesson.py
apples = [310, 322, 292, 288, 300, 346]
# ここに、要素をソートして表示するコードを記述する
print(sorted(apples))

```

2.リストを逆順にソートする

```lesson.py
apples = [310, 322, 292, 288, 300, 346]
ここに、要素をソートして表示するコードを記述する
print(sorted(apples,reverse=True))
```

3.英単語リストをアルファベット順に並べる

```lesson.py
words = ["pumpkin", "orange", "apple", "carrot", "onion"]
# ここに、要素をソートして表示するコードを記述する
print(sorted(words))
``` 

## 06:辞書の整列

```lesson.py
weapons={"イージスソード":40,"ウィンドスピア":12,"アースブレイカー":99}
#辞書として表示する
print(sorted(weapons))
print(weapons)

#辞書をキーでソート(整列)する
#タプル・・・データ構造の一種、内容の更新は不可
#リストのように様座な値をまとめて管理するデータ構造のこと
print(sorted((weapons).items()))
```

##演習

1.辞書をキーで昇順にソートしてみよう

```lesson.py

math = {"いいだ" : 12, "えんどう" : 99, "あだち" : 40}
# この下で、辞書をキーでソートして出力しよう
# 辞書の整列

#辞書として表示する
print(sorted(math))

```

2.辞書をソートして辞書で出力する

```lesson.py

# 辞書をソートして辞書で出力する
math = {"えんどう" : 99, "あだち" : 40, "いいだ" : 12}

# この下で、辞書をキーでソートして、辞書として出力しよう
print(sorted((math).items()))
```

##07RPGのアイテム一覧を再現1

```lesson.py
アイテム一覧:複数のアイテム画像を表示する
剣、縦、回復薬、回復薬、クリスタル

1.アイテム画像とアイテム名を表示する
2.同じアイテムを複数表示したい
3.アイテムの並び順を管理したい
4.同じアイテム画像のファイルは１つを共有

辞書と配列を組み合わせる
並び順用リスト item_oders

|  並び順|  アイテム名 |
| ---- | ---- |
|  0   |  クリスタル|
|  1   |  "剣"  |
|  2   |  "回復薬"  |
|  3   |  "盾"  |


↓item_ordersをキーにして、↓の画像ファイルを取り出すようにする

画像用辞書 item.images
|  アイテム名  | 画像ファイル |
| ----       | ---- |
|  剣        |  剣の画像  |
|  クリスタル   |  クリスタルの画像  |
|  盾        |  盾の画像  |
|  回復薬     |  回復薬の画像  |

これをコードにすると、
item_orders[0]→itemimages[item_orders[0]]→クリスタルの画像ファイル
item_orders[1]→itemimages[item_orders[1]]→剣
:
:
を繰り返すプログラムを作りたい

 ```
 
##08:RPGのアイテム一覧を再現2

 
 ```lesspn.py
 
 # 画像用ハッシュ
item_images = {
    "剣":"http://paiza.jp/learning/images/sword.png",
    "盾":"http://paiza.jp/learning/images/shield.png",
    "回復薬":"http://paiza.jp/learning/images/potion.png",
    "クリスタル":"http://paiza.jp/learning/images/crystal.png"
}

# アイテムの並び順配列
items_order = ["クリスタル", "盾", "剣", "回復薬", "回復薬", "回復薬"]

#print(item_images)
#print(items_order)

````

```lesson.py

for item_name in items_order:
    print(item_name)

出力
クリスタル
盾
剣
回復薬
回復薬
回復薬


```

```lesson.py

#アイテム名を取り出す
for item_name in items_order:
    print(item_images[item_name])
    print(item_name)
    
http://paiza.jp/learning/images/crystal.png
クリスタル
http://paiza.jp/learning/images/shield.png
盾
http://paiza.jp/learning/images/sword.png
剣
http://paiza.jp/learning/images/potion.png
回復薬
http://paiza.jp/learning/images/potion.png
回復薬
http://paiza.jp/learning/images/potion.png
回復薬

```

```lesson.py

#アイテム名を取り出す
for item_name in items_order:
    print("<img src='"+item_images[item_name]+"'>")
    print(item_name+"<br>")
<img src='http://paiza.jp/learning/images/crystal.png'>
クリスタル
<img src='http://paiza.jp/learning/images/shield.png'>
盾
<img src='http://paiza.jp/learning/images/sword.png'>
剣
<img src='http://paiza.jp/learning/images/potion.png'>
回復薬
<img src='http://paiza.jp/learning/images/potion.png'>
回復薬
<img src='http://paiza.jp/learning/images/potion.png'>
回復薬
```

##演習

1.画像を順番に出力する

```lesson.py

items_imges = {
    "剣" : "http://paiza.jp/learning/images/sword.png",
    "盾" : "http://paiza.jp/learning/images/shield.png",
    "回復薬" : "http://paiza.jp/learning/images/potion.png",
    "クリスタル" : "http://paiza.jp/learning/images/crystal.png"
}

# アイテムの並び順リスト
items_orders = ["剣", "盾", "回復薬", "クリスタル"]

# ここから下を記述しよう
for item_name in items_orders:
    print("<img src='"+items_imges[item_name]+"'><br>")
````

2.アイテムリストを作ってみよう


```lesson.py
入力
6
回復薬
盾
クリスタル
クリスタル
剣
剣

# 画像用辞書
items_imges = {
    "剣" : "http://paiza.jp/learning/images/sword.png",
    "盾" : "http://paiza.jp/learning/images/shield.png",
    "回復薬" : "http://paiza.jp/learning/images/potion.png",
    "クリスタル" : "http://paiza.jp/learning/images/crystal.png"
}

# ここから下を記述しよう
# 出力するアイテム数を変数に代入
item_cnt = int(input())

# 標準入力にあるアイテムを出力する
while item_cnt > 0:
  item = input()
  print("<img src = '" + items_imges[item] + "'>")
  item_cnt = item_cnt - 1
  
出力
<img src = 'http://paiza.jp/learning/images/potion.png'>
<img src = 'http://paiza.jp/learning/images/shield.png'>
<img src = 'http://paiza.jp/learning/images/crystal.png'>
<img src = 'http://paiza.jp/learning/images/crystal.png'>
<img src = 'http://paiza.jp/learning/images/sword.png'>
<img src = 'http://paiza.jp/learning/images/sword.png'>
  
````