Python入門トップページ


目次

  1. プログラミング言語
  2. Anaconda - Jupyter Notebook / JupyterLab の環境設定
  3. Python の基礎
  4. リスト,タプル,辞書,集合
    1. リスト
    2. タプル
    3. 辞書
    4. 集合
  5. 再び Jupyter Notebook の操作
  6. Python の制御構文
  7. 関数
  8. 便利な関数など
  9. リストの内包表記
  10. 多次元リスト
  11. クラス
  12. 演習問題
  13. 雑多な情報

Python の基礎

リスト,タプル,辞書,集合

辞書

辞書はリストと似ています.リストは0,1,2,...というオフセットで要素を順番に管理していた.辞書では(Python 3.6までは)要素に順序はなく,一意のキーで管理します.ただし,Python 3.7 からはキーの順序も保証されるようになった.

辞書の生成

辞書を生成するには,'キー' : 値, を複数並べて { } で囲う.次の例では有名な小説(源氏物語(紫式部),坊っちゃん(夏目漱石),走れメロス(太宰治),羅生門(芥川龍之介))の冒頭の文を,小説のタイトルをキーに管理します.


novels = {
    "genji" : "どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。",
    "bocchan" : "親譲の無鉄砲で小供の時から損ばかりしている。",
    "meros" : "メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。",
    "rashomon" : "ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。",
 }

全体を表示します.Python 3.6 以前での結果は要素の順序は保証されませんでした.


print(novels)
{'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。', 'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。', 'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。', 'meros': 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。'}

しかしながら,Python 3.7 以降では定義した順序で表示されるようになりました.


print(novels)
{'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。', 'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。', 'meros': 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。', 'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。'}

特定の要素を取り出すにはキーを指定すれば良いでしょう.坊っちゃんの冒頭だけ取り出してみよう.


print(novels['bocchan'])
親譲の無鉄砲で小供の時から損ばかりしている。

目次に戻る

要素の追加と書き換え

要素を追加するには新たなキーを指定するだけで良いでしょう.「学問ノススメ(福沢諭吉)」も追加しよう.追加した結果について,以前は要素の順番が保証されていなかったが,Python 3.7 以降では最後に追加されているはずです.次の例は Python 3.9 系での結果です.


novels['gakumon'] = '「天は人の上に人を造らず人の下に人を造らず」と言えり。'
print(novels)
{'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。', 'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。', 'meros': 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。', 'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。', 'gakumon': '「天は人の上に人を造らず人の下に人を造らず」と言えり。'}

既存のキーを指定すれば,要素が書き換えられる.「走れメロス」の文を短く変更してみます.


novels['meros'] = 'メロスは激怒した。'
print(novels)
{'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。', 'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。', 'meros': 'メロスは激怒した。', 'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。', 'gakumon': '「天は人の上に人を造らず人の下に人を造らず」と言えり。'}

目次に戻る

del で要素を削除する

キーを指定して要素を削除できます.


del novels['meros']
print(novels)
{'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。', 'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。', 'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。', 'gakumon': '「天は人の上に人を造らず人の下に人を造らず」と言えり。'}

目次に戻る

キーがあるかどうか知りたい

in を使います.指定したキーが辞書にあれば True,なければ False を返す.「源氏物語」のキー「genji」が辞書にあるかチェックします.


novels = {
    "genji" : "どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。",
    "bocchan" : "親譲の無鉄砲で小供の時から損ばかりしている。",
    "meros" : "メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。",
    "rashomon" : "ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。",
 }
'genji' in novels
True

「銀河鉄道の夜」 (ginga) は登録されていない.


'ginga' in novels
False

目次に戻る

すべてのキーを取得する

keys()ですべてのキーを取得できます.これは辞書に対して繰り返し処理を行う際などに利用されます.


novels.keys()
dict_keys(['genji', 'bocchan', 'meros', 'rashomon'])

目次に戻る

すべての値を取得する

values()ではすべての値を取得できます.これは辞書に対して繰り返し処理を行う際などに利用されます.


novels.values()
dict_values(['どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。', '親譲の無鉄砲で小供の時から損ばかりしている。', 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。', 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。'])

目次に戻る

すべてのキーと値を取得する

items()ですべてのキーと値を取得できます.これは辞書に対して繰り返し処理を行う際などに利用されます.


novels.items()
dict_items([('genji', 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。'), ('bocchan', '親譲の無鉄砲で小供の時から損ばかりしている。'), ('meros', 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。'), ('rashomon', 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。')])

目次に戻る

get で要素を取得する

上で説明したとおり,特定の要素を取り出すには次のようにキーを指定すると良いでしょう.


novels['genji']
'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。'

しかし,この方法ではキーが存在しない場合にエラーが生じ,プログラムが強制終了してしまいます.


novels['ginga']
--------------------------------------------------
KeyError         Traceback (most recent call last)

強制終了させないためには上の方法により,キーがあるかどうかを予めチェックする方法と,get() を使う方法があります.キーがある場合は get() もこれまでと同じ動作をします.


novels.get('genji')
'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。'

キーが存在しなければ結果は None となり,プログラムの処理は強制終了せずに(続きがあれば)継続されます.


novels.get('ginga')
(何も表示されない)

また,キーが見つからない場合に返す値を指定することもできます.


novels.get('genji', '見つかりません')
'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。'

novels.get('ginga', '見つかりません')
'見つかりません'

目次に戻る

すべての要素を削除する

clear()ですべての要素を削除できます.


novels.clear()
novels
{}

目次に戻る

pprintで整形して表示する

print() を使って辞書を表示したとき,必ずしも見やすい形式で表示される訳ではありません.


novels = {
  "genji" : "どの天皇様の御代であったか",
  "bocchan" : "親譲の無鉄砲で",
  "meros" : "メロスは激怒した。",
  "rashomon" : "ある日の暮方の事である。",
}
print(novels)
{'genji': 'どの天皇様の御代であったか', 'bocchan': '親譲の無鉄砲で', 'meros': 'メロスは激怒した。', 'rashomon': 'ある日の暮方の事である。'}

pprint() 使うと読みやすく整形して表示してくれます.なお,辞書以外にも様々なオブジェクトについて見やすく表示できます.


from pprint import pprint
novels = {
    "genji" : "どの天皇様の御代であったか",
    "bocchan" : "親譲の無鉄砲で",
    "meros" : "メロスは激怒した。",
    "rashomon" : "ある日の暮方の事である。",
  }
pprint(novels)
{'bocchan': '親譲の無鉄砲で',
  'genji': 'どの天皇様の御代であったか',
  'meros': 'メロスは激怒した。',
  'rashomon': 'ある日の暮方の事である。'}

目次に戻る