2020年2月18日 星期二

用內建模組 pprint 列印字典物件

這個 pprint 模組是我在歐萊禮的 "深入淺出 Python (第二版)" 這本書第三章末尾讀到的, 以前讀過好幾本 Python 書籍都不知道有這東西, 原來它可以整齊漂亮地列印複雜的字典 (即巢狀字典, 字典裡面還有字典).

Python 裡面最複雜的內建資料型態是字典, 也就是一群鍵值對物件的群集 (collection). 字典的鍵必須是可雜湊的 (hashable), 不可變的資料型態例如 int, float, bool, complex, str, tuple 這六種型別都可算出唯一的雜湊值, 因此都可以作為 key; 而 list, set, 與 dict 這三個可變型別為不可雜湊 (unhashable), 因此不能做 key, 參考 :

python中的hashable(可雜湊的)是什麼意思

字典的值可以是任何一種物件型態 (Python 的資料全部都是物件), 當然也可以是另一個字典, 例如 :

>>> p1={'name':'孫藝珍',
    'age':38,
    'diploma':'首爾藝術大學'}
>>> p2={'name':'玄彬',
    'age':37,
    'diploma':'中央大學戲劇電影學系'}
>>> p={'p1':p1,'p2':p2}
>>> print(p)
{'p1': {'name': '孫藝珍', 'age': 38, 'diploma': '首爾藝術大學'}, 'p2': {'name': '玄彬', 'age': 37, 'diploma': '中央大學戲劇電影學系'}}

可見直接用 print() 列印巢狀字典時, 每個項目會前後串在一起不容易閱讀. 使用內建模組 pprint 的 pprint() 函數可以讓每個項目分開條列, pprint 模組使用前須先匯入 :

>>> import pprint
>>> pprint.pprint(p)
{'p1': {'age': 38, 'diploma': '首爾藝術大學', 'name': '孫藝珍'},
 'p2': {'age': 37, 'diploma': '中央大學戲劇電影學系', 'name': '玄彬'}}

不過 pprint() 的整齊列印只限於最外層項目, 例如新增一個含有內層字典的項目 p3 :

>>> p3={'name':'河智苑',
    'age':41,
    'diploma':'檀國大學戲劇電影學系',
    'works':{'2006':'黃真伊',
             '2013':'奇皇后',
     '2019':'巧克力'}}
>>> p['p3']=p3

用 print() 列印全部項目串在一起 :

>>> print(p)
{'p1': {'name': '孫藝珍', 'age': 38, 'diploma': '首爾藝術大學'}, 'p2': {'name': '玄彬', 'age': 37, 'diploma': '中央大學戲劇電影學系'}, 'p3': {'name': '河智苑', 'age': 41, 'diploma': '檀國大學戲劇電影學系', 'works': {'2006': '黃真伊', '2013': '奇皇后', '2019': '巧克力'}}}

用 pprint() 只有外層項目會逐項整齊條列 :

>>> pprint.pprint(p)
{'p1': {'age': 38, 'diploma': '首爾藝術大學', 'name': '孫藝珍'},
 'p2': {'age': 37, 'diploma': '中央大學戲劇電影學系', 'name': '玄彬'},
 'p3': {'age': 41,
        'diploma': '檀國大學戲劇電影學系',
        'name': '河智苑',
        'works': {'2006': '黃真伊', '2013': '奇皇后', '2019': '巧克力'}}}

可見內層項目 works 的值不會逐項條列.

沒有留言 :