这是一本字典:
data = {
'a': {
'b': {
'c': {
'd': {
'e': {
'f': 1,
'g': 50,
'h': [1, 2, 4],
'i': 3,
'j': [7, 9, 6],
'k': [
[('x', 'abc')],
[('y', 'qwe')],
[('z', 'zxc')]
]
}
}
}
}
}
}
我的目标是在可能的情况下找到并将值转换为字典:
data = {
'a': {
'b': {
'c': {
'd': {
'e': {
'f': 1,
'g': 50,
'h': [1, 2, 4],
'i': 3,
'j': [7, 9, 6],
'k': [{
'x': 'abc'
}, {
'y': 'qwe'
}, {
'z': 'zxc'
}]
}
}
}
}
}
}
我认为可以使用递归完成,我甚至写了一个,但它不起作用。
def f(d):
for key, value in d.iteritems():
if type(d[key]) is dict:
f(d)
try:
d[key] = dict(d[key])
except:
if type(d[key]) is list:
for i in d[key]:
try:
d[key][i] = dict(d[key][i])
except:
pass
return d
错误:
RecursionError:调用Python对象时超出了最大递归深度
如何让它发挥作用?
如果你能提供一个没有递归的解决方案,我也很乐意得到它。
答案 0 :(得分:2)
你的程序中有很多错误,让我们来看看它们并提出一个工作版本。
def f(d):
for key, value in d.iteritems():
if type(d[key]) is dict:
f(d) # You should call d[key] instead
try:
d[key] = dict(d[key]) # Never assign an object back to the one you are iterating over, create a new object instead.
except:
if type(d[key]) is list:
for i in d[key]:
try:
d[key][i] = dict(d[key][i]) # This doesn't work, can't convert a tuple/list this way.
except:
pass
return d
以下是具有两个递归函数的代码的更正版本。一个用于列表,另一个用于词典。
def f1(value):
e = []
for val in value:
if type(val) is list:
e += f1(val) # Append list to current list
elif type(val) is tuple:
e.append({val[0]: val[1]}) # Convert tuple to dictionary
else:
e.append(val) # Append normal list values normally
return e
def f(d, e = {}):
for key, value in d.iteritems():
if type(value) is dict:
e[key] = f(value, {}) # Recurse for dictionaries
elif type(value) is list:
e[key] = f1(value) # Call the other recursive function for list
else:
e[key] = value # Otherwise like strings and ints just append
return e
答案 1 :(得分:0)
如果它是字典,您可以在d
上递归调用该函数,而不是value
。
只需将其更改为:
if type(value) is dict:
f(value)