这是我正在写的一个示例json扩展递归:
data = {
'name': 'randy smith',
'age': 20,
'address': {
'street': '13301 parkwood',
'city': 'new york',
'state': 'ny',
'zip': 20039
}
}
def expand_json(data, prefix='', expanded_data={}):
for key in data:
# base case is when the structure is not a dict or array
if not isinstance(data[key], (list, dict)):
expanded_data[prefix + key] = data[key]
else:
expand_json(data[key], prefix=key + '.', expanded_data=expanded_data)
return expanded_data
>> expand_json(data) {'name': 'randy smith', 'age': 20, 'address.street': '13301 parkwood', 'address.city': 'new york', 'address.state': 'ny', 'address.zip': 20039}
此函数使用哪种类型的递归:例如线性或尾部? (或其他?)将其重写为使用另一种“递归”类型的示例是什么?
例如,如果您直接返回递归的值,则只有尾递归
return expand_json(...)
如果在递归调用返回后执行其他任何操作,则为普通的递归。
由于您在进行递归调用后继续执行for
循环,因此显然不是尾递归。
请注意,您的代码还有另一个问题。您不应该在参数列表中使用expanded_data = {}
。参见"Least Astonishment" and the Mutable Default Argument。初始化如下:
def expand_json(data, prefix='', expanded_data=None):
if expanded_data is None:
expanded_data = {}
for key in data:
# base case is when the structure is not a dict or array
if not isinstance(data[key], (list, dict)):
expanded_data[prefix + key] = data[key]
else:
expand_json(data[key], prefix=key + '.', expanded_data=expanded_data)
return expanded_data