Skip to content

再帰関数2#

Pythonでリストと辞書が混じったJSON形式のデータを再帰的に解析する関数の例

import json

def parse_json(data):
    if isinstance(data, list):
        for item in data:
            parse_json(item)
    elif isinstance(data, dict):
        for key, value in data.items():
            parse_json(value)
    else:
        # データの型がリストでも辞書でもない場合に実行する処理
        # ここでは単純にデータを表示する例を示します。
        print(data)

この関数では、再帰的に呼び出されることで、与えられたJSONデータのすべての要素を走査します。

isinstance()関数を使用して、データがリストか辞書かを判別し、リストの場合はその要素を再帰的に呼び出します。

辞書の場合は、各キーに対応する値を再帰的に呼び出します。また、データがリストでも辞書でもない場合には、任意の処理を実行することができます。

この関数をJSON形式のデータに適用するには、まずjson.loads()関数を使用してJSON文字列をPythonオブジェクトに変換します。そして、変換されたオブジェクトをparse_json()関数に渡します。

例えば、以下のJSONデータがあるとします。

{
  "foo": [
    1,
    2,
    {
      "bar": "baz"
    }
  ],
  "qux": {
    "quux": 3
  }
}

このJSONデータを解析するには、次のようにします。

json_data = '{"foo": [1, 2, {"bar": "baz"}], "qux": {"quux": 3}}'
parsed_data = json.loads(json_data)
parse_json(parsed_data)

このコードを実行すると、以下のような出力が得られます。

出力結果
1
2
baz
3

この例では、JSONデータの各要素を単純に表示するようになっていますが、任意の処理を行うことができます。

例えば、特定の条件を満たす要素だけを抽出することもできます。

以下は、前回の例を改良したコードです。このコードでは、JSONデータの各要素に対して、任意の関数を適用することができます。

具体的には、parse_json()関数に、第2引数として関数オブジェクトを渡しています。この関数オブジェクトは、JSONデータの各要素に対して適用されます。

import json

def parse_json(data, func):
    if isinstance(data, list):
        for item in data:
            parse_json(item, func)
    elif isinstance(data, dict):
        for key, value in data.items():
            parse_json(value, func)
    else:
        func(data)

以下は、この関数を使用して、JSONデータから数字のリストを抽出する例です。

extract_numbers()関数は、JSONデータの各要素が数字であるかどうかを調べ、数字であればリストに追加します。

def extract_numbers(data):
    if isinstance(data, (int, float)):
        numbers.append(data)

json_data = '{"foo": [1, 2, {"bar": "baz"}], "qux": {"quux": 3}}'
parsed_data = json.loads(json_data)

numbers = []
parse_json(parsed_data, extract_numbers)

print(numbers)

このコードを実行すると、以下の出力が得られます。

出力結果
[1, 2, 3]

この例では、JSONデータの各要素が数字であるかどうかを調べるために、isinstance()関数を使用しています。

また、数字であればリストに追加するために、append()メソッドを使用しています。

他にも、JSONデータから特定の要素だけを抽出するために、辞書のキーを調べる処理を追加することもできます。

また、リスト内の要素の順序を保持するために、enumerate()関数を使用して、リストのインデックスを取得することもできます。

適切な関数を選択することで、JSONデータから必要な情報を抽出することができます。