Python でプリティプリント辞書

Rayven Esplanada 2023年10月10日
  1. Python で辞書をプリティプリントするには pprint() を使用する
  2. Python で辞書をプリティプリントするには json.dumps() を使用する
  3. Python で辞書をきれいに出力するには yaml.dump() を使用する
Python でプリティプリント辞書

このチュートリアルでは、Python で辞書をプリティ出力する方法を紹介します。プリティプリントとは、何かをより読みやすい形式やスタイルで表示することを意味します。

Python で辞書をプリティプリントするには pprint() を使用する

pprint は、Python のデータ型をより読みやすくするために、Python のデータ型をきれいに出力する機能を提供する Python モジュールです。このモジュールはプリティプリント辞書もサポートしています。

pprint モジュール内には同じ名前の pprint() という関数があり、これは与えられた文字列やオブジェクトをプリティプリントするために使われる関数です。

まず、辞書の配列を宣言します。その後、関数 pprint.pprint() を用いてプリティプリントします。

import pprint

dct_arr = [
    {"Name": "John", "Age": "23", "Country": "USA"},
    {"Name": "Jose", "Age": "44", "Country": "Spain"},
    {"Name": "Anne", "Age": "29", "Country": "UK"},
    {"Name": "Lee", "Age": "35", "Country": "Japan"},
]

pprint.pprint(dct_arr)

出力:

[{'Age': '23', 'Country': 'USA', 'Name': 'John'},
 {'Age': '44', 'Country': 'Spain', 'Name': 'Jose'},
 {'Age': '29', 'Country': 'UK', 'Name': 'Anne'},
 {'Age': '35', 'Country': 'Japan', 'Name': 'Lee'}]

比較のために、以下は通常の print() 文の出力です。

[
    {"Name": "John", "Age": "23", "Country": "USA"},
    {"Name": "Jose", "Age": "44", "Country": "Spain"},
    {"Name": "Anne", "Age": "29", "Country": "UK"},
    {"Name": "Lee", "Age": "35", "Country": "Japan"},
]

pprint() の出力の方が断然読みやすいです。これが何をするかというと、配列の各辞書要素をカンマの直後で区切ると同時に、辞書の値をキーでソートします。

キーと値のペアをキーでソートしたくないのであれば、pprint() は使うべき関数ではありません。

もう一つ注意すべきことは、pprint() は入れ子になった辞書を含めて、入れ子になったオブジェクトをきれいには表示しないということです。ですから、値が入れ子になっていることを期待しているのであれば、これはそのための解決策ではありません。

Python で辞書をプリティプリントするには json.dumps() を使用する

Python の json モジュール内には、dumps() という関数があり、Python オブジェクトを JSON 文字列に変換します。変換の他にも、辞書をきれいな JSON フォーマットにフォーマットしてくれます。

dumps() 関数は、プリティプリントに使われる 3つのパラメータを受け付けます。変換対象のオブジェクト、キーでソートするかどうかを決めるブール値 sort_keys、インデントのためのスペース数を指定する indent です。

この解決策には、上記と同じ辞書の例を使用します。sort_keys はソートを無効にするために False を設定し、indent はスペースを 4 に設定します。

import json

dct_arr = [
    {"Name": "John", "Age": "23", "Country": "USA"},
    {"Name": "Jose", "Age": "44", "Country": "Spain"},
    {"Name": "Anne", "Age": "29", "Country": "UK"},
    {"Name": "Lee", "Age": "35", "Country": "Japan"},
]

print(json.dumps(dct_arr, sort_keys=False, indent=4))

出力:

[
    {
        "Age": "23",
        "Country": "USA",
        "Name": "John"
    },
    {
        "Age": "44",
        "Country": "Spain",
        "Name": "Jose"
    },
    {
        "Age": "29",
        "Country": "UK",
        "Name": "Anne"
    },
    {
        "Age": "35",
        "Country": "Japan",
        "Name": "Lee"
    }
]

関数 pprint() の出力に比べて、これは非常に読みやすくなっていますが、JSON 形式なので行数は多くなります。

与えられた値の中に入れ子になった辞書がある場合はどうでしょうか?例を少し編集して、出力を見てみましょう。

import json

dct_arr = [
    {"Name": "John", "Age": "23", "Residence": {"Country": "USA", "City": "New York"}},
    {"Name": "Jose", "Age": "44", "Residence": {"Country": "Spain", "City": "Madrid"}},
    {"Name": "Anne", "Age": "29", "Residence": {"Country": "UK", "City": "England"}},
    {"Name": "Lee", "Age": "35", "Residence": {"Country": "Japan", "City": "Osaka"}},
]

print(json.dumps(dct_arr, sort_keys=False, indent=4))

出力:

[
    {
        "Name": "John",
        "Age": "23",
        "Residence": {
            "Country": "USA",
            "City": "New York"
        }
    },
    {
        "Name": "Jose",
        "Age": "44",
        "Residence": {
            "Country": "Spain",
            "City": "Madrid"
        }
    },
    {
        "Name": "Anne",
        "Age": "29",
        "Residence": {
            "Country": "UK",
            "City": "England"
        }
    },
    {
        "Name": "Lee",
        "Age": "35",
        "Residence": {
            "Country": "Japan",
            "City": "Osaka"
        }
    }
]

json.dump() を使用すると、きれいな JSON のネストされた辞書がサポートされていることがわかります。

Python で辞書をきれいに出力するには yaml.dump() を使用する

辞書をきれいに表示するもう一つの方法は、yaml モジュールの dump() 関数を使用することです。これは json.dumps() 関数と同じ目的を果たしますが、JSON ではなく YAML 形式です。

まず、pip を使って YAML モジュールをインストールします。

pip install pyyaml

または、Python 3 と pip3 を使っている場合は pip3 をインストールしてください。

pip3 install pyyaml

JSON の例で使ったのと同じネストした例で試してみましょう。

ダンプの出力スタイルを inline にするか block にするかを決定する新しいパラメータ default_flow_style に注意してください。この場合、出力は読み取り可能にする必要があるため、ブロックスタイルにする必要があるため、このパラメーターを False に設定します。

import yaml

dct_arr = [
    {"Name": "John", "Age": "23", "Residence": {"Country": "USA", "City": "New York"}},
    {"Name": "Jose", "Age": "44", "Residence": {"Country": "Spain", "City": "Madrid"}},
    {"Name": "Anne", "Age": "29", "Residence": {"Country": "UK", "City": "England"}},
    {"Name": "Lee", "Age": "35", "Residence": {"Country": "Japan", "City": "Osaka"}},
]

print(yaml.dump(dct_arr, sort_keys=False, default_flow_style=False))

出力:

- Name: John
  Age: '23'
  Residence:
    Country: USA
    City: New York
- Name: Jose
  Age: '44'
  Residence:
    Country: Spain
    City: Madrid
- Name: Anne
  Age: '29'
  Residence:
    Country: UK
    City: England
- Name: Lee
  Age: '35'
  Residence:
    Country: Japan
    City: Osaka

要約すると、YAML の dump() 関数が JSON の dumps() 関数よりも読みやすいかどうかは主観的なものです。個人の好みやどのような出力が必要かによります。どちらの関数も、より複雑なデータ構造や入れ子になったオブジェクトに関しては pprint の出力に勝るものがあります。

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

関連記事 - Python Dictionary

関連記事 - Python Print