python - 这个递归 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',
},
}
我试图弄清楚它是如何工作的,特别是“前缀”参数是如何工作的,在什么情况下它不会为空。
解决方案
该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()]
推荐阅读
- javascript - Angularjs typeahead显示对象数组
- xsl-fo - 左侧为原文,右侧为正对译文
- xamarin.ios - 为 android 类库 vs 2017 生成 nugetpackage
- javascript - 使用 CSV 或 JS 文件填充 HTML 表格中的特定 TD
- json - Angular - 我如何在整个 JSON 中替换整个字符?
- flutter - 我的 Flutter FutureBuilder 如何在布局中的多个位置更改文本?
- botframework - LUIS 机器人不考虑单数/复数意图
- sql-server - 每 5 秒将连续的 DateTime 值插入表中
- php - php MYSQL 覆盖最后一个连接链接
- matplotlib - 在 Matplotlib 中对齐忽略 BoxStyle/FancyBboxPatch/bbox 填充