繁体   English   中英

清理字典的嵌套字典和字典列表中的字典键

[英]cleaning dict keys in nested dict of dicts & lists of dicts

我也有一个带有字典列表的嵌套字典,我的一些键有特殊字符。 从键中删除这些特殊字符的最佳方法是什么。

我尝试过的以下内容适用于 dicts 的 dicts,但我如何扩展它以处理 dicts 列表。

>>> a={"@pipeline": "start",  "@args": "-vv", "@start": "1598331637", "@info": {"@pipeline_stage": "tasks","@taskbegin": [{"@task": "1", "@time": "1598331638"}, {"@task": "2", "@time": "1598331638"}, {"@task": "3", "@time": "1598331638"}]}}
>>> a
{'@pipeline': 'start', '@args': '-vv', '@start': '1598331637', '@info': {'@pipeline_stage': 'tasks', '@taskbegin': [{'@task': '1', '@time': '1598331638'}, {'@task': '2', '@time': '1598331638'}, {'@task': '3', '@time': '1598331638'}]}}
>>> def _clean_keys(d):
...     return {''.join(filter(str.isalnum, k)): _clean_keys(v) for k, v in d.items()} if isinstance(d, dict) else d
... 
>>> _clean_keys(a)
{'pipeline': 'start', 'args': '-vv', 'start': '1598331637', 'info': {'pipelinestage': 'tasks', 'taskbegin': [{'@task': '1', '@time': '1598331638'}, {'@task': '2', '@time': '1598331638'}, {'@task': '3', '@time': '1598331638'}]}}
>>> 

如您所见,taskbegin 列表没有被清除。

使用递归

前任:

a={"@pipeline": "start",  "@args": "-vv", "@start": "1598331637", "@info": {"@pipeline_stage": "tasks","@taskbegin": [{"@task": "1", "@time": "1598331638"}, {"@task": "2", "@time": "1598331638"}, {"@task": "3", "@time": "1598331638"}]}}
def _clean_keys(d):
    res = {}
    if isinstance(d, dict):
        for k, v in d.items():   
            k = ''.join(filter(str.isalnum, k))      
            if isinstance(v, list):                   #Check if type of value is list
                res[k] = [_clean_keys(i) for i in v]  #use recursion
            else:
                res[k]= _clean_keys(v)
            
    else:
        res = d           
        
    return res

print(_clean_keys(a))

输出:

{'args': '-vv',
 'info': {'pipelinestage': 'tasks',
          'taskbegin': [{'task': '1', 'time': '1598331638'},
                        {'task': '2', 'time': '1598331638'},
                        {'task': '3', 'time': '1598331638'}]},
 'pipeline': 'start',
 'start': '1598331637'}

试试这个,效果很好

代码

def clean_dict(val):
    if type(val) == list:
        return clean_list(val)
    if type(val) == dict:
        return {clean(k) : clean_dict(v) for k, v in val.items()}
    return val

def clean_list(val):
    return [clean_dict(v) for v in val]

def clean(val):
   ''.join([c for c in val if c.isalnum()])

输出

a={"@pipeline": "start",  "@args": "-vv", "@start": "1598331637", "@info": {"@pipeline_stage": "tasks","@taskbe
gin": [{"@task": "1", "@time": "1598331638"}, {"@task": "2", "@time": "1598331638"}, {"@task": "3", "@time": "1
598331638"}]}}

clean_dict(a)
Out[8]:
{'pipeline': 'start',
 'args': '-vv',
 'start': '1598331637',
 'info': {'pipelinestage': 'tasks',
  'taskbegin': [{'task': '1', 'time': '1598331638'},
   {'task': '2', 'time': '1598331638'},
   {'task': '3', 'time': '1598331638'}]}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM