Pythonの辞書機能とは
Pythonには辞書(dictionary)という機能があるらしい.どのような場面でどのように使用するのか釈然としない.とりあえず小さなサンプルを作って学習してみた.
結論としては,辞書はリストに似た存在ではあるが,{key : value} のペアでリスト化されていて,キーを参照すると,その値が返されるというものである.
データの構造を見ると分かりやすい.以下は九州7県の人口の辞書である.
{'福岡': 5099604, '熊本': 1756944, '佐賀': 818865', 大分': 1143976, '長崎': 1341702, '宮崎': 1081413, '鹿児島': 1616005}
全体は中括弧で括られていて,コロン:の前後がペアになったデータである.関連したデータを別々の配列に記憶させる必要がないのでたいへん便利である.
IDLEのシェルで実行
まずは,辞書の作成はPythonの統合環境,IDLEのシェルで,福岡と熊本のデータをタイプし,辞書名はdic_kjinkoとした.
>>>dic_kjinko = {'福岡': 5099604, '熊本': 1756944} ⬅辞書の基本型を作成
キーの一覧を表示させるには,
>>>list( dic_kjinko.keys() )と打ち込むと,現在登録されているキーが表示される.
['福岡', '熊本']
が返ってくる.
>>> dic_kjinko['福岡'] と入力して福岡の値を表示させると,
5099604
が返ってくる.
辞書の追加
>>> dic_kjinko['佐賀']=818865 ⬅ 佐賀のデータを追加
>>> list( dic_kjinko.keys() ) ⬅ 辞書のキーを表示
['福岡', '熊本', '佐賀']
>>> dic_kjinko['大分']=1143976 ⬅ 大分のデータを追加
>>> dic_kjinko['長崎']=1341702 ⬅ 長崎のデータを追加
>>> dic_kjinko['宮崎']=1081413 ⬅ 宮崎のデータを追加
>>> dic_kyuPjinko['鹿児島']=1616005 ⬅ 鹿児島のデータを追加
>>> list( dic_kjinko.keys() ) ⬅ 辞書のキー(県名)を表示
['福岡', '熊本', '佐賀', '大分', '長崎', '宮崎', '鹿児島']
>>> list( dic_kjinko.values() ) ⬅ 辞書の値(人口)を表示
[5099604, 1756944, 818865, 1143976, 1341702, 1081413, 1616005]
>>> sorted(dic_kjinko.keys()) ⬅ キーでソート(漢字コード順)
['佐賀', '大分', '宮崎', '熊本', '福岡', '長崎', '鹿児島']
>>> sorted(dic_kjinko.keys(),reverse=True) ⬅ キーで逆ソート
['鹿児島', '長崎', '福岡', '熊本', '宮崎', '大分', '佐賀']
>>> sorted(dic_kjinko.values()) ⬅valueでソート
[818865, 1081413, 1143976, 1341702, 1616005, 1756944, 5099604]
>>> sorted(dic_kjinko.values(),reverse=True) ⬅ valueで逆ソート
[5099604, 1756944, 1616005, 1341702, 1143976, 1081413, 818865]
>>> print(dic_kjinko) ⬅ 辞書の全内容を表示
{'福岡': 5099604, '熊本': 1756944, '佐賀': 818865, '大分': 1143976, '長崎': 1341702, '宮崎': 1081413, '鹿児島': 1616005}
>>>
IDLEのエディターでプログラムとして実行
IDLEを起動して新規作成を選択すると,編集画面があらわれる.
dic_kjinko = {'福岡': 5099604, '熊本': 1756944}を入力し保存.
追加するには以下のプログラムを実行する.
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
dic_kjinko['佐賀'] =818865 ⬅辞書に追加
dic_kjinko['大分'] =1143976 ⬅辞書に追加
dic_kjinko['長崎'] =1341702 ⬅辞書に追加
dic_kjinko['宮崎'] =1081413 ⬅辞書に追加
dic_kjinko['鹿児島'] =1616005 ⬅辞書に追加
print(dic_kjinko)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
実行結果
dic_kjinko = {'福岡': 5099604, '熊本': 1756944, '佐賀': 818865, '大分': 1143976, '長崎': 1341702, '宮崎': 1081413, '鹿児島': 1616005}
最大値,最小値等も求めることができる.
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
print(dic_kjinko.keys())
print(dic_kjinko.values())
#valueの最大値・最小値
print(min(dic_kjinko[x] for x in dic_kjinko))
print(max(dic_kjinko[x] for x in dic_kjinko))
#valueで最大・最小を調べ,対応するkeyを得る
print(min(dic_kjinko, key=lambda x:dic_kjinko[x]))
print(max(dic_kjinko, key=lambda x:dic_kjinko[x]))
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
実行結果
dict_keys(['福岡', '熊本', '佐賀', '大分', '長崎', '宮崎', '鹿児島'])
dict_values([5099604, 1756944, 818865, 1143976, 1341702, 1081413, 1616005])
818865
5099604
佐賀
福岡
円グラフを描く処理を追加したプログラム
# utf-8 coding
dic_jinko = {'福岡': 5099604, '熊本': 1756944}
#print(dic_kjinko)
dic_kjinko['佐賀'] =818865 # ⬅辞書に追加
dic_kjinko['大分'] =1143976 # ⬅辞書に追加
dic_kjinko['長崎'] =1341702 # ⬅辞書に追加
dic_kjinko['宮崎'] =1081413 # ⬅辞書に追加
dic_kjinko['鹿児島'] =1616005 # ⬅辞書に追加
print(dic_kjinko)
print(dic_kjinko.keys())
print(dic_kjinko.values())
#valueの最大値・最小値を調べ,表示
print(min(dic_kjinko[x] for x in dic_kjinko))
print(max(dic_kjinko[x] for x in dic_kjinko))
#valueの最大・最小に対応するkeyを得る
print(min(dic_kjinko, key=lambda x:dic_kjinko[x]))
print(max(dic_kjinko, key=lambda x:dic_kjinko[x]))
temp=sorted(dic_kjinko.items(), key=lambda x: x[1], reverse=True) #valueの大きい順に配列を並べ替え. x[1]は辞書もvalue, 辞書のkeyはx[0].
dic_temp=dict(temp) #辞書型へ変換
#print(dic_temp)
#グラフ描画
import matplotlib.pyplot as plt
#plt.rcParams['font.family'] = 'AppleGothic' #日本語表示フォント(別のフォントに変更)
plt.rcParams['font.family'] = 'IPAexGothic'
import numpy as np
plt.title("九州各県の人口比率", loc='left',fontsize=20)
labels = dic_temp.keys()
x = dic_temp.values()
explode = (0, 0.1, 0, 0,0,0,0) #2番めの0.1は少し外側に表示させるため指定
plt.pie(x, labels=labels, startangle=90, autopct='%.1f%%', explode=explode)
plt.axis('equal')
plt.show()
日本語フォントとして AppleGothicを指定したが,九州各県の「県」および 鹿児島の「児」が文字化けした.フォントとして,IPAexGothic をダウンロードしてライブラリ (~/Library/Fonts/) にコピーし,フォントキャッシュを削除すると解決した.
グラフの色は未指定,オート配色
X軸に対して左回り90°から大きい順に表示
%表示は自動計算
タイトルは左寄せ,フォントサイズは20
sxplodeで熊本を浮かせて表示
👈 福岡への一極集中! 2018年4月1日現在
{'福岡': 5099604, '熊本': 1756944, '鹿児島': 1616005, '長崎': 1341702, '大分': 1143976, '宮崎': 1081413, '佐賀': 818865}
👈 1970年の人口比率
データを入れ替えて表示
{'福岡': 4027416, '鹿児島': 1729150, '熊本': 1700229, '長崎': 1570245, '大分': 1155566, '宮崎': 1051105, '佐賀': 838468}