再帰関数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データがあるとします。
このJSONデータを解析するには、次のようにします。
json_data = '{"foo": [1, 2, {"bar": "baz"}], "qux": {"quux": 3}}'
parsed_data = json.loads(json_data)
parse_json(parsed_data)
このコードを実行すると、以下のような出力が得られます。
この例では、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)
このコードを実行すると、以下の出力が得られます。
この例では、JSONデータの各要素が数字であるかどうかを調べるために、isinstance()関数を使用しています。
また、数字であればリストに追加するために、append()メソッドを使用しています。
他にも、JSONデータから特定の要素だけを抽出するために、辞書のキーを調べる処理を追加することもできます。
また、リスト内の要素の順序を保持するために、enumerate()関数を使用して、リストのインデックスを取得することもできます。
適切な関数を選択することで、JSONデータから必要な情報を抽出することができます。