[英]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.