首页 > 解决方案 > 这个递归 Python 代码是如何工作的?

问题描述

我遇到了这个应该展平字典的递归函数:

def flatten(data, prefix='', separator='.'):
    """Flattens a nested dict structure. """
    if not isinstance(data, dict):
        return {prefix: data} if prefix else data

        result = {}
        for (key, value) in data.items():
            result.update(flatten(value,_get_new_prefix(prefix, key, separator),
            separator=separator))
        return result

def _get_new_prefix(prefix, key, separator):
    return (separator.join((prefix, str(key))) if prefix else str(key))

它也应该被输入这些数据:

nested = {
 'fullname': 'Alessandra',
 'age': 41,
 'phone-numbers': ['+447421234567', '+447423456789'],
 'residence': {'address': {'first-line': 'Alexandra Rd','second-line': '',},
 'zip': 'N8 0PP',
 'city': 'London',
 'country': 'UK',
 },
}

我试图弄清楚它是如何工作的,特别是“前缀”参数是如何工作的,在什么情况下它不会为空。

标签: pythonrecursion

解决方案


flatten()函数沿树构建路径,其中路径中的名称由分隔符分隔。前缀被添加到该路径的开头。

prefix仅当您将其设置为 时才为“空” None。这将具有抑制前缀的效果。

例如,比较这个的输出:

[print(k, ' = ', v) for k,v in flatten(nested, prefix='xxx', separator='/').items()]

...有了这个:

[print(k, ' = ', v) for k,v in flatten(nested, prefix=None).items()]

推荐阅读