python再帰インスタンス(recursion in real world using python)

4289 ワード

既存のデータの構造は次のとおりです.
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

出力結果: