python再帰インスタンス(recursion in real world using python)
4289 ワード
既存のデータの構造は次のとおりです.
Pythonの基本データ型である辞書のタイプに詳しいと、「大きな辞書」であることがわかりやすい.辞書には辞書も含まれており、データ複合人間の論理を組織しているが、プログラミング時にはこれらのデータを解析する必要がある.たとえば、このようなデータを解析する必要があります.
では、このような解析機能をどのように実現するのでしょうか.
再帰を使うのはいいようですね.
再帰的な方法を使用して、上記の辞書データを「平らにする」ようにします.
再帰的な方法を使用して、上記の辞書データを「平らにする」ようにします.
出力結果:
recipes = {
'apple_pie': {
'ingredients': ['flour', 'sugar', 'eggs', 'shortening', 'apples', 'cinnamon'],
'cook_time': 60,
'prep_time': 30,
'ratings': {'john': 10, 'emily': 8, 'mom': 4}
},
'peanut_butter_cookies': {
'ingredients': ['flour', 'sugar', 'peanut_butter', 'butter', 'eggs'],
'cook_time': 45,
'prep_time': 20,
'allergens': ['peanuts']
},
'clam_chowder': {
'ingredients': ['flour', 'milk', 'clams', 'vegetable_stock', 'salt'],
'cook_time': 120,
'prep_time': 30,
'allergens': ['shellfish']
}
}
Pythonの基本データ型である辞書のタイプに詳しいと、「大きな辞書」であることがわかりやすい.辞書には辞書も含まれており、データ複合人間の論理を組織しているが、プログラミング時にはこれらのデータを解析する必要がある.たとえば、このようなデータを解析する必要があります.
{'apple_pie/cook_time': 60,
'apple_pie/ingredients': ['flour',
'sugar',
'eggs',
'shortening',
'apples',
'cinnamon'],
'apple_pie/prep_time': 30,
'apple_pie/ratings/emily': 8,
'apple_pie/ratings/john': 10,
'apple_pie/ratings/mom': 4,
'clam_chowder/allergens': ['shellfish'],
'clam_chowder/cook_time': 120,
'clam_chowder/ingredients': ['flour',
'milk',
'clams',
'vegetable_stock',
'salt'],
'clam_chowder/prep_time': 30,
'peanut_butter_cookies/allergens': ['peanuts'],
'peanut_butter_cookies/cook_time': 45,
'peanut_butter_cookies/ingredients': ['flour',
'sugar',
'peanut_butter',
'butter',
'eggs'],
'peanut_butter_cookies/prep_time': 20}
データをよく見ると、辞書には小さな辞書がありません.通俗的には中の大きなデータ(辞書)を割って平らにします.では、このような解析機能をどのように実現するのでしょうか.
再帰を使うのはいいようですね.
再帰的な方法を使用して、上記の辞書データを「平らにする」ようにします.
def flatten(obj):
if isinstance(obj, list):
# if object is a list object, flatten every sub e.ement
result = []
for elem in obj:
flat_elem = flatten(elem)
result.append(flat_elem)
elif isinstance(obj, dict):
# if object is a dictionary, flatten it on level
result = {}
for key, value in obj.items():
if isinstance(value, dict):
flat_value = flatten(value)
for subkey, subvalue in flat_value.items():
flat_key = '/'.join([key, subkey])
result[flat_key] = subvalue
else:
result[key] = value
else:
# otherwise just return the value
result = obj
return result
再帰的な方法を使用して、上記の辞書データを「平らにする」ようにします.
def flatten(obj):
if isinstance(obj, list):
# if object is a list object, flatten every sub e.ement
result = []
for elem in obj:
flat_elem = flatten(elem)
result.append(flat_elem)
elif isinstance(obj, dict):
# if object is a dictionary, flatten it on level
result = {}
for key, value in obj.items():
if isinstance(value, dict):
flat_value = flatten(value)
for subkey, subvalue in flat_value.items():
flat_key = '/'.join([key, subkey])
result[flat_key] = subvalue
else:
result[key] = value
else:
# otherwise just return the value
result = obj
return result
出力結果: