today::エンジニアに憧れる非エンジニア

今のところは、エンジニアとは言えないところの職種です。しかしエンジニア的なものの考え方に興味津津。

Pythonあれこれ 2021-01-29

概要

「Head First Python 第2版」を進めていった中で考えたことの記録です。

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

  • 作者:Paul Barry
  • 発売日: 2018/03/24
  • メディア: 単行本(ソフトカバー)

データ型の一種としてのコレクション

  • コレクションは、オブジェクトの集まりを表すデータ型一般を指す
  • Pythonにおけるコレクションの例
    • リスト
    • タプル
    • 辞書(連想配列Pythonにおける実装)
    • 集合
    • frozenset
    • 文字列
  • その他有名なコレクションの例
    • 配列
    • テーブル
    • ツリー
    • グラフ
  • コレクションに用意されている操作の一般的な例
    • 新しい空のコレクションを作成する
    • コレクションの要素の数を取得する
    • コレクションの任意の要素を取得する
    • コレクションの内容を空にする
    • コレクションに新たな要素を追加する
    • コレクションの要素を削除する

Pythonの辞書について

  • 「一意なキーと、キーに対応する任意の値のペア」を要素とするコレクション
    • キーと値のペアは、任意個含むことができる
    • キーと値のペアを「行」とも呼ぶ
  • タプルやリストとは異なり、順序を持たないデータ構造である
    • 各要素の格納順は保証されない
    • 出力時に各要素の出力順を決め打ちする場合、組み込み関数sorted()を用いる
  • 辞書を表すリテラルは中括弧{}である
    • オブジェクトの区切りはカンマ,である
    • キーと値の区切りはコロン:である
  • 辞書に対する反復処理について
    • 辞書そのものに反復処理を行った場合、当該辞書内全てのキーをコンテナとして取得する動作になる
    • keys()メソッドにより、当該辞書内全てのキーをコンテナとして取得することができる
    • values()メソッドにより、当該辞書内全ての値をコンテナとして取得することができる
    • items()メソッドにより、当該辞書内全ての行をコンテナとして取得することができる
      • for文に2つの変数を与えることにより、1番目の変数に各行のキーを、2番目の変数に各行の値を取得することができる
  • 辞書のキーは初期化しなければならない
    • 存在しないキーを参照しようとすると、例外KeyErrorをスローする
    • 「存在しないキーを参照するとデフォルト値を返す」というget()関数も辞書に定義されている
  • 辞書に対してin演算子を使用した場合、「指定されたキーを持つ行が辞書に存在するか否か」を返す
    • 左辺には「ハッシュ化可能なオブジェクト」、右辺には「辞書」を置く
    • 戻り値はTrueまたはFalseである

Pythonの辞書に関するコード例

found = {}
print(found)
# => {}

↑空の辞書foundを定義し、その内容を標準出力に出力する

found = {}
found['a'] = 0
found['e'] = 0
found['i'] = 0
found['o'] = 0
found['u'] = 0
print(found)
# => {'a': 0, 'e': 0, 'i': 0, 'o': 0, 'u': 0}

↑以下、上記コードの動作について解説

  • 空の辞書foundを定義し、行5つを初期化する
    • 各行の初期値は0
  • 行の初期化順と辞書における行の並び順が一致しているのは偶然である
    • 辞書においては、各要素の格納順は保証されない
print(found)
# => {'a': 0, 'e': 0, 'i': 0, 'o': 0, 'u': 0}
for kv in found:
    print(kv)
# => a
# => e
# => i
# => o
# => u

↑辞書そのものに反復処理を行った場合、当該辞書内全てのキーをコンテナとして取得する動作になる

print(found)
# =>{'a': 0, 'e': 2, 'i': 0, 'o': 0, 'u': 0}
for k in found:
    print(k, 'の出現回数は', found[k], '回。')

# => a の出現回数は 0 回。
# => e の出現回数は 2 回。
# => i の出現回数は 0 回。
# => o の出現回数は 0 回。
# => u の出現回数は 0 回。

↑以下、上記コードの動作についての解説

  • キーと値のセットを得るコードの一例
    • 値を辞書名[キー]という形で得ている
print(found)
# =>{'a': 0, 'e': 2, 'i': 0, 'o': 0, 'u': 0}
print(sorted(found))
# => ['a', 'e', 'i', 'o', 'u']
print(sorted(found.items()))
# => [('a', 0), ('e', 2), ('i', 0), ('o', 0), ('u', 0)]

↑以下、上記コードの動作についての解説

  • 辞書を引数としてsorted()関数を使った場合、戻り値はリストとなる
  • 辞書のitems()メソッドの結果を引数としてsorted()関数を使った場合、戻り値は「タプルから成るリスト」となる
    • タプルの1番目の要素は、元の辞書のキーの1つ
    • タプルの2番目の要素は、元の辞書において当該キーに対応する行の値
for k,v in sorted(found.items()):
    print(k, 'の出現回数は', v, '回。')

↑以下、上記コードの動作についての解説

  • 辞書founditems()メソッドを呼び出し、反復ごとに各行にアクセスする
    • 各行のキーは変数kに取得する
    • 各行の値は変数vに取得する
  • 辞書のitems()メソッドの結果を引数としてsorted()関数を使った場合、戻り値は「タプルから成るリスト」となる
  • 取得したkおよびvを用いて出力メッセージを作成し、標準出力に出力する