汎用性のあるロジックを作成するために、データの深さや構造に関係なくすべての値を再帰的に結合し、search_string
を生成するアプローチを考えます。リストや辞書のネストがあっても対応できるように、再帰関数を使ってすべての値を抽出し、|
で結合するようにします。
以下はその実装例です。
import json
# 値を再帰的に取り出して '|' で結合する関数
def recursive_collect_values(data):
values = []
if isinstance(data, dict):
# 辞書の場合はすべてのキーに対して再帰的に処理
for value in data.values():
values.extend(recursive_collect_values(value))
elif isinstance(data, list):
# リストの場合はすべての要素に対して再帰的に処理
for item in data:
values.extend(recursive_collect_values(item))
else:
# 基本的な値(文字列や数値)はそのままリストに追加
values.append(str(data))
return values
# データの処理
data = [
{
"name": "test",
"url": "https://github.com/test/test",
"description": "test",
"stars": 0,
"tags": [
{
"tag1": "tag1のデータ",
"tag2": "tag2のデータ"
},
{
"tag1": "tag1のデータ",
"tag2": "tag2のデータ"
}
]
},
{
"name": "test2",
"url": "https://github.com/test/test2",
"description": "test2",
"stars": 0,
"tags": [
{
"tag1": "tag1のデータ",
"tag2": "tag2のデータ"
},
{
"tag1": "tag1のデータ",
"tag2": "tag2のデータ"
}
]
}
]
# 各データに対して search_string を追加
for item in data:
collected_values = recursive_collect_values(item)
search_string = '|'.join(collected_values)
item['search_string'] = search_string
# 結果を表示
print(json.dumps(data, ensure_ascii=False, indent=4))
このロジックの説明:
-
recursive_collect_values
関数は、データが辞書であればその値を再帰的に処理し、リストであればその要素を処理してすべての値を収集します。 - 数値や文字列などの単純な値はそのまま文字列に変換してリストに追加します。
- 最終的にすべての値を
|
で連結し、search_string
として追加します。
このアプローチのメリット:
- 任意の深さや複雑なネスト構造を持つデータにも対応可能。
- リストや辞書を問わず、すべてのデータを文字列として処理できます。
- 各項目の構造に依存せず、新しいフィールドが追加されても自動で処理します。
このようにして、将来的にデータ構造が変更されても再利用できる汎用的なロジックを作成しました。