例題(1)
Contents
概要
*
ポイント
この課題で使うPythonの機能 (学習のヒント)
[ edit ]
- この例題のポイント ...
辞書(dict)を使いましょう.
- 「キーと値の対」の集合です.
- 順序はありません
collectionsモジュールのOrderedDictは順序を保持します
- Pythonの将来的な版では順序を保持する方向に行きそうです.
- 「キーと値の対」を追加登録できます.
- 「キーと値の対」を削除できます.
- 順序はありません
- 「キー」でアクセスして「値」を効率よく取り出すことができます.
- 速さについては,いずれ実験しましょう
- キーについて
- 同じキーで複数登録することはできません.
- キーとして使えるデータオブジェクト
- 文字列,数値
- タプル(文字列,数値,および,その他のタプルのみを含む場合)
- 日付オブジェクトはキーとして使えます
- キーとして使えないデータオブジェクト
- 直接的ないし間接的に変更可能(ミュータブル)なオブジェクトを含むタプルは,使えません
- 当然,リストもキーとしては使えません
- 値
- もちろん,たまたま,同じ値があってもかまいません.
- 「キーと値の対」の集合です.
この例題における解法 (問題解決のヒント)
[ edit ]
- この例題における解法 (問題解決のヒント) ....
- 戦国武将の生誕日と死没日については,下記のような記録があります
- 西暦年については,グレゴリオ暦が西暦1582年10月15日~で,それ以前はユリウス暦(ユリウス暦1582年10月5日をグレゴリオ暦10月15日とした)ということになっていますが...
- もっとも,これは,グレゴリウス13世がグレゴリオ暦を採用した日ですが,そのことは,おそらく,まだ日本に伝わっていません.
- Wikipediaに記載されている生誕日,死没日に関しては,どちらを採用しているかどうかが,よくわかりません.
- 但し,Wikipediaの徳川家康の項だけ,生誕日はユリウス暦で死没日はグレゴリオ暦と記載されていました.
- なので,日本に伝わっていたかどうかは別として,1582年10月15日を境に,それ以前はユリウス暦,それ以降はグレゴリオ暦というように統一されているのだろうと推定しています.
- 諸説ありますので,そのうちの一つを選びました.
- 決して信頼性の高いものを選んだというわけではありません
- 単に例題用のデータとして使うだけなので,悪しからず
- 北条早雲など調べてみたのですが,生まれた年月日が分からない人も結構いるようです.
- 結構例題データづくりが大変でしたが,何か,よい例題データのアイデアがあったら教えてくださいね.
- 授業等で,データベースなどを扱う機会があったら,そのときにも使います.
- 一応,今考えているのは....
- 都道府県の情報⇒ファイル入力をやった後で例題にします
- 結構例題データづくりが大変でしたが,何か,よい例題データのアイデアがあったら教えてくださいね.
- 歴代総理大臣の情報⇒あまり魅力的なデータではないけれど...
- 歴代オリンピックの情報⇒2020年に向けて,課題にしてもよいかなぁと考えています
- 決して信頼性の高いものを選んだというわけではありません
武将名
生誕日
死没日
参考資料
上杉謙信
享禄3年1月21日
1530-02-18
天正6年3月13日
1578-04-19
織田信長
天文3年5月12日
1534-06-23
天正10年6月2日
1582-06-21
森蘭丸
永禄8年?月?日
1565-??-??
天正10年6月2日
1582-06-21
島左近
天文9年5月5日
1540-06-09
慶長5年9月15日
1600-10-21
武田信玄
大永元年11月3日
1521-12-01
元亀4年4月12日
1573-05-13
徳川家康
天文11年12月26日
1543-01-31
元和2年04月17日
1616-06-01
豊臣秀吉
天文6年2月6日
1537-03-17
慶長3年8月18日
1598-09-18
伊達政宗
永禄10年8月3日
1567-09-05
寛永13年5月24日
1636-06-27
実行例
*
本質的な部分 (授業中に順次公開します)
[ edit ]
- (1) 初期値として,織田信長,豊臣秀吉,徳川家康の誕生日を登録しておきます
- もちろん,空集合{}から,登録していってもかまいません.
- 初期値は,dict()でもよいでしょう.
# ----- 辞書の初期値 (キーと値の対の集合) -----
birth_day_dict = { "織田信長":"1534-06-23" , "徳川家康":"1543-01-31", \
"豊臣秀吉":"1537-03-17" }
print( birth_day_dict )
- (2) 辞書に追加登録します
- 島左近さんだけ,和暦表示でした.
# ----- 辞書の追加登録 -----
birth_day_dict["上杉謙信"] = "1530-02-18"
birth_day_dict["島左近"] = "天文9年5月5日"
birth_day_dict["武田信玄"] = "1521-12-01"
birth_day_dict["伊達政宗"] = "1567-09-05"
print( birth_day_dict )
- (3) 辞書内容の一覧表示ができます
- キーと値のタプルを順次得ることができます.
# ----- 辞書の内容でforループ -----
for k, v in birth_day_dict.items():
print( k, v )
- 辞書に上書き登録します
- 島左近さんの登録を上書きして,西暦表示にします.
# ----- 辞書に上書き登録 (同じキーで二つ以上登録できない) -----
birth_day_dict["島左近"] = "1540-06-09"
- (5) 辞書を検索します
# ----- 辞書の検索 (キーで検索し,値を返します) -----
print( "織田信長", "さんの誕生日は", birth_day_dict["織田信長"], "です." )
print( "伊達政宗", "さんの誕生日は", birth_day_dict["伊達政宗"], "です." )
- (6) 辞書に登録されているか否かはチェックできま
# ----- 登録の有無のチェック -----
if "飯島正" in birth_day_dict:
print( "飯島正", "さんの誕生日は", birth_day_dict["飯島正"], "です." )
else:
print( "飯島正", "さんの誕生日は", "未登録です." )
- (7) 辞書に登録されていない場合に,デフォールト値を返すこともできます
# ----- 辞書の検索 (登録されていない場合に,デフォールト値を返します) -----
print( "飯島正", "さんの誕生日は", birth_day_dict.get( "飯島正", "未登録です" ) )
- (8) 辞書から登録を削除することができます
# ----- 登録の削除 (登録がなければKeyError例外を送出する) -----
del birth_day_dict["島左近"]
- (9) 登録されていない人を検索してみます.
- 島左近さんを検索してみます." )
実行時エラーとなり,KeyError例外が送出されます
# ----- 検索 (登録がなければKeyError例外を送出する) -----
print( birth_day_dict["島左近"] )
高度な話題 (授業中,もしくは授業後に順次公開します)
[ edit ]
⇒ 高度な話題へのリンク: 授業の流れを阻害しないように別ページにします
- (後日の回の授業内容にはなる可能性がありますが,この回の授業内容には含めません).
配布コード (授業中に順次公開します)