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

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

Pythonあれこれ 2021-01-30 - 複合データ構造

概要

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

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

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

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

組み込みデータ構造を組み合わせる

  • Pythonでは、組み込みデータ構造を任意に組み合わせたデータ構造を作ることができる
    • Pythonの組み込みデータ構造には、あらゆるオブジェクトを格納できる
    • 当然ながら、自作クラスのインスタンスも組み込みデータ構造に格納することができる
    • 組み込みデータ構造を自作クラスのフィールドとして使うこともできる
  • 組み込みデータ構造を組み合わせる例
    • 辞書の辞書
    • リストのリスト
    • リストの集合
    • 辞書のタプル
  • 改めて組み込みデータ構造の特徴
    • リスト・辞書・集合は、必要に応じて拡張や縮小が可能である
    • リスト・辞書・集合の拡張や縮小を行った場合でも、メモリの割り当てや解放はPythonインタプリタが自動で行う
people = {}
people['フォード'] = {'名前': 'フォード・プリーフェクト',
                      '性別': '男性',
                      '職業': '研究者',
                      '母星': 'ベテルギウス第7星'}
people['アーサー'] = {'名前': 'アーサー・デント',
                      '性別': '男性',
                      '職業': 'サンドイッチ職人',
                      '母星': '地球'}
people['トリリアン'] = {'名前': 'トリシア・マクミラン',
                        '性別': '女性',
                        '職業': '数学者',
                        '母星': '地球'}
people['ロボット'] = {'名前': 'マーヴィン',
                      '性別': '不明',
                      '職業': '偏執症アンドロイド',
                      '母星': '不明'}

↑以下、上述コードの説明

  • peopleという辞書を定義し、辞書peopleの各行に辞書を代入している
  • peopleという辞書には、代入が済んだ時点で4つのキーが存在する
    • 'フォード'
    • 'アーサー'
    • 'トリリアン'
    • 'ロボット'
print(people)
# => {'フォード': {'名前': 'フォード・プリーフェクト', '性別': '男性', '職業': '研究者', '母星': 'ベテルギウス第7星'}, 'アーサー': {'名前': 'アーサー・デント', '性別': '男性', '職業': 'サンドイッチ職人', '母星': '地球'}, 'トリリアン': {'名前': 'トリシア・マクミラン', '性別': '女性', '職業': '数学者', '母星': '地球'}, 'ロボット': {'名前': 'マーヴィン', '性別': '不明', '職業': '偏執症アンドロイド', '母星': '不明'}}

↑以下、上述コードの説明

  • 先程4つの行を追加した
  • データ構造は、{{key: value, ...},{key: value, ...},{key: value, ...},{key: value, ...}}となっている
    • {}が5つずつ存在する
  • 全て1行(右端で折り返し)で表示されており、人間には見づらい
import pprint
pprint.pprint(people)
# => {'アーサー': {'名前': 'アーサー・デント', '性別': '男性', '母星': '地球', '職業': 'サンドイッチ職人'},
# =>  'トリリアン': {'名前': 'トリシア・マクミラン', '性別': '女性', '母星': '地球', '職業': '数学者'},
# =>  'フォード': {'名前': 'フォード・プリーフェクト', '性別': '男性', '母星': 'ベテルギウス第7星', '職業': '研究者'},
# =>  'ロボット': {'名前': 'マーヴィン', '性別': '不明', '母星': '不明', '職業': '偏執症アンドロイド'}}

↑以下、上述コードの説明

  • pprintモジュールのpprint関数は、複合データ構造を人間がわかりやすい形に整形して標準出力に出力する
    • 関数名pprintは'pretty print'の略
    • 辞書people各行が、画面上の1行として表示されている
  • pprint関数を使っても、辞書peopleのデータ構造そのものに変化はない
    • {}が5つずつ存在する

複合データ構造のデータにアクセスする

print(people['アーサー'])
# => {'名前': 'アーサー・デント', '性別': '男性', '職業': 'サンドイッチ職人', '母星': '地球'}

↑辞書peopleの、'アーサー'というキーを持つ行にアクセスする

print(people['アーサー']['職業'])
# => 'サンドイッチ職人'

↑辞書peopleの、'アーサー'というキーを持つ行の'職業'というキーを持つ属性にアクセスする