【问题标题】:cleaning dict keys in nested dict of dicts & lists of dicts清理字典嵌套字典和字典列表中的字典键
【发布时间】:2020-12-15 22:13:20
【问题描述】:

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

我尝试过的以下内容适用于 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 列表未清理。

【问题讨论】:

    标签: python python-3.x dictionary nested


    【解决方案1】:

    使用递归

    例如:

    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'}
    

    【讨论】:

      【解决方案2】:

      试试这个,效果很好

      代码

      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'}]}}
      

      【讨论】:

        猜你喜欢
        • 2021-07-24
        • 2022-11-22
        • 2021-05-10
        • 1970-01-01
        • 1970-01-01
        • 2021-08-09
        • 2021-05-17
        • 2012-05-21
        • 2021-12-20
        相关资源
        最近更新 更多