我需要迭代一个复杂的字典并根据几个条件修改它。
这是一个非常基本的字典示例
a = {
'x' : ["x1", "x2", 'x3'],
'y' : [
{'y1' : 1},
{'y2' : 2.0},
{'y3' : True},
{'y4' : 99},
],
'z' : {
'x' : ["a1", "a2", 'a3'],
'y' : [
{'y1' : 66},
{'y2' : False},
{'y3' : 3},
{'y4' : 4.3},
]
},
'y3' : "Delete Me"
}
Î遍历它,也没有问题,例如:
pTypes = [str, bool, int, float]
def parse(d, c):
t = type(d)
if t == dict:
for k, v in d.items():
parse(v, c+[k])
elif t == list:
for i, p in enumerate(d):
parse(p,c+[i])
elif t in pTypes:
print(c,'=>',d)
else:
print('Error: ',c,d,t)
parse(a,[])
我的问题是,我需要删除所有键 == 'y3' 或值 > 50 的项目
此外,所有字符串都需要用“-”括起来,例如“x1”=>“-x1-”
仅仅修改数据是不行的(不是持久化的)
...
elif t in pTypes:
if t == str:
d = '-'+d+'-'
...
我不知道如何在迭代字典本身时删除项目。
由于字典可能很大,我不想制作原件的“缩小”副本。
有人可以帮忙吗?
确切的预期输出尚不清楚,但由于您正在迭代嵌套结构,因此最好生成一个新对象。
保持原来的递归逻辑,你应该在每一步添加一个
return
来传播你的对象:
def parse(d):
if isinstance(d, dict):
return {k: parse(v) for k, v in d.items()
if k != 'y3' and not
(isinstance(v, (int, float)) and v>50)}
elif isinstance(d, list):
return [parse(x) for x in d]
elif isinstance(d, str):
return f'-{d}-'
else:
return d
out = parse(a)
输出:
{'x': ['-x1-', '-x2-', '-x3-'],
'y': [{'y1': 1}, {'y2': 2.0}, {}, {}],
'z': {'x': ['-a1-', '-a2-', '-a3-'],
'y': [{}, {'y2': False}, {}, {'y4': 4.3}]}}