Python:迭代和修改包括列表的复杂字典

问题描述 投票:0回答:1

我需要迭代一个复杂的字典并根据几个条件修改它。

这是一个非常基本的字典示例

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+'-'
...

我不知道如何在迭代字典本身时删除项目。

由于字典可能很大,我不想制作原件的“缩小”副本。

有人可以帮忙吗?

python dictionary parsing
1个回答
0
投票

确切的预期输出尚不清楚,但由于您正在迭代嵌套结构,因此最好生成一个新对象。

保持原来的递归逻辑,你应该在每一步添加一个

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}]}}
© www.soinside.com 2019 - 2024. All rights reserved.