リストの次は辞書です。
辞書はリストに似ていますが、番号で管理されていないので0や1などのインデックスは使わずキーで呼び出します。連想配列もしくはハッシュなどと呼んだりします。
それでは、各国の軍師をハッシュにしてみましょう。
gynshi = {"羽柴":"竹中半兵衛","今川":"太原崇孚雪斎","毛利":"黒田官兵衛"}
print(gynshi["今川"])
出力結果)
太原崇孚雪斎
今川と指定すると太原崇孚雪斎と返ってきます。
このキーには変数を与える事もできます。
gynshi = {"羽柴":"竹中半兵衛","今川":"太原崇孚雪斎","毛利":"黒田官兵衛"}
cyuugoku = "毛利"
print(gynshi[cyuugoku])
出力結果)
黒田官兵衛
ハッシュのキーを変数にしても変数の中身が読み出されます。
辞書の基本操作
まずは、素直にすべて読みだしてみます。
gunshi = {"羽柴":"竹中半兵衛","今川":"太原崇孚雪斎","毛利":"黒田官兵衛"}
print(gunshi)
出力結果)
{‘羽柴’: ‘竹中半兵衛’, ‘今川’: ‘太原崇孚雪斎’, ‘毛利’: ‘黒田官兵衛’}
リストが[]で囲われていたのに対し、辞書は{}です。ややこしいですね。
次はリストと同じように中身を数えてみましょう。
同じようにlen関数です。
gunshi = {"羽柴":"竹中半兵衛","今川":"太原崇孚雪斎","毛利":"黒田官兵衛"}
print(len(gunshi))
出力結果)
3
さて、歴史上秀吉の軍師は竹中半兵衛から黒田官兵衛に入れ替わりますので、今度はハッシュの値を入れ替えてみましょう。
ついでにハッシュの数も数えてみます。
gunshi = {"羽柴":"竹中半兵衛","今川":"太原崇孚雪斎","毛利":"黒田官兵衛"}
gunshi["羽柴"] = "黒田官兵衛"
print(gunshi)
print(len(gunshi))
出力結果)
{‘羽柴’: ‘黒田官兵衛’, ‘今川’: ‘太原崇孚雪斎’, ‘毛利’: ‘黒田官兵衛’}
3
羽柴の軍師が黒田官兵衛に変わり、ハッシュの数は変わっていないのがわかります。
ところで、毛利が官兵衛でかぶっていますので、次は毛利の軍師を消します。
要素の数も数えましょう。
gunshi = {"羽柴":"竹中半兵衛","今川":"太原崇孚雪斎","毛利":"黒田官兵衛"}
del gunshi["毛利"]
print(gunshi)
print(len(gunshi))
出力結果)
{‘羽柴’: ‘竹中半兵衛’, ‘今川’: ‘太原崇孚雪斎’}
2
毛利が消えました。
安国寺恵瓊は軍師には向いていないですからね。
ループで出力する
次は、上杉謙信を分析して、中身を全て出力してみます。
kenshin = {"武力" : "100", "感" : 80, "子孫" : 0, "信仰心" : "毘沙門天" }
for txt in kenshin:
print(kenshin[txt])
出力結果)
100
80
0
毘沙門天
- For分の名前をtxtとして、kenshinが続く限りループ処理します。
- ハッシュkenshinのキーをtxtとすると、ハッシュにあるキーが順番に読み出されます。
- 文字列にはダブルクォーテーションがつき、数字にはつけなくてよいのに注目して下さい。
辞書に関連するメソッド
辞書に含まれる全てのキー、値、キーと値の組み合わせを取得するのにメソッドが用意されています。キーの取得には keys()、値の取得にはvalues()、組み合わせの取得にはitems()を使用します。
さて、各国の武将とエンカウントしてみます。
所属と武将の両方を出したいので、items()メソッドを使います。
teki = {"松平":"本多忠真", "福島":"可児才蔵","木下":"仙石秀久"}
for (busyou, teki) in teki.items():
print(busyou + "の" + teki + "の襲撃!")
- まず敵のハッシュを作ります。
- ror文の()内、カウンタ変数をbusyou,tekiと付けてtekiハッシュにitems()メソッドをつけてキーと値の両方を取り出し、中身がある限りループ処理します。
- キーと値を出力します。
出力結果)
松平の本多忠真の襲撃!
福島の可児才蔵の襲撃!
木下の仙石秀久の襲撃!
さらに敵武将たちの攻撃力を設定して、同時に攻撃されたらどれだけダメージを受けるか計算してみましょう。
busyou = {"本多忠真" : 100, "可児才蔵" : 90, "仙石秀久" : 80}
sum = 0
for (kougeki, busyou) in busyou.items():
sum = sum + busyou
print(sum, end="")
print("のダメージを受けた!")
- busyouという辞書に、各武将と数値を入力します。
- 合計するのでsumという変数を作り、初期値として0にします。
- for文開始。引数はkougekiとbusyouとし、busyouの中身が続く限りループします。組み合わせで使うわけではないですが、itemus関数を入れます。
- for内の処理は、sumに先程の変数sumにそのループ時の辞書の値であるbusyouを加算してききます。
- sumを出力し、改行無しにします。
- おまけのテキストを出力します。
出力結果)
270のダメージを受けた!
合計すると、こんなダメージを受けるのがわかります。
辞書のソート
辞書もリストと同じようにソートできます。
石高の辞書を作ってみます。
これを標準では値でソート、
kuni = {"播磨" : 35, "武蔵" : 66, "大和" : 44}
#標準で出力
print(kuni)
#キーでソートする
print(sorted(kuni))
#リバースソート
print(sorted(kuni,reverse=True))
#タプル(キーと値)でソートする
print(sorted(kuni.items()))
出力結果
{'播磨': 35, '武蔵': 66, '大和': 44}
['大和', '播磨', '武蔵']
['武蔵', '播磨', '大和']
[('大和', 44), ('播磨', 35), ('武蔵', 66)]
リストと同じようにソートできました!