Я получаю сложные структуры, которые могу являть собой разные сочетания вложенных словарей и списков друг в друга. Например, вот такие наборы:
a={'tr': {'td': [{'attributes': {'width': '7%'}}, {'text': 'eLIBRARY ID:', 'a': {'text': '58061', 'attributes': {'href': 'title_about_new.asp?id=58061'}}, 'attributes': {'width': '43%', 'align': 'left'}}, {'text': 'Язык описания:', 'font': {'text': 'русский', 'attributes': {'color': '#000000'}}, 'attributes': {'width': '48%', 'align': 'right'}}, {'attributes': {'width': '2%'}}], 'attributes': {'valign': 'middle'}}, 'attributes': {'width': '550', 'cellspacing': '0', 'cellpadding': '3', 'border': '0'}} a= [{'1':1, "2":[{'3':3},{'4':[{'11':11, '12':12, 'attributes':'pf'}, {'attributes':'pf'}]}, {'attributes':'pf'}], '5':5, 'attributes':'pf'}] a= [{'1':1, "2":[{'3':3},{'4':4}, {'attributes':'pf'}], '5':5, 'attributes':'pf'}] a={'1':1, "2":[{'3':3},{'4':4}, {'attributes':'pf'}], '5':5, 'attributes':'pf'} a=[{'3':3},{'4':4}, {'attributes':'pf'}] a={'3':3, '4':4, 'attributes':'pf'} a={'3':{'4':4, 'attributes':'pf'},'5':3} a={'3':{'4':4, 'attributes':'pf'},'5':3, '6':{'attributes':'pf','7':7, '8':{'9':9, 'attributes':'pf', '10':10}}, 'attributes':'pf'}
Поскольку я не могу знать заранее количество уровней вложенности, то, единственный способ, который мне пришёл в голову - рекурсия.
Мне удалось написать функцию, которая делает почти то, что мне нужно:
def del_element(dict_or_list): if isinstance(dict_or_list,list): res=[] for i in dict_or_list: res.extend(del_element(i)) yield res if isinstance(dict_or_list,dict): del_key = ('attributes',) for key in del_key: if key in dict_or_list: del dict_or_list[key] for k, v in dict_or_list.items(): if isinstance(v, dict) and (len(v)!=0): yield from del_element(v) if isinstance(v, list): res = [] for i in v: res.extend(del_element(i)) for i in range(len(res)): if len(res[i]) == 0: del res[i] yield res if (len(dict_or_list)!=0): yield dict_or_list
В итоге, я получаю объект-генератор, с которым дальше работаю так:
a = del_element(a) for b in a: b=b print(b)
Но вот проблема, не знаю как с этим справиться. После работы функции на примере выражения:
a= [{'1':1, "2":[{'3':3},{'4':[{'11':11, '12':12, 'attributes':'pf'}, {'attributes':'pf'}]}, {'attributes':'pf'}], '5':5, 'attributes':'pf'}]
[[{'3': 3}, , {'4': [{'11': 11, ‘12’: 12}, {}]}], {'1': 1, ‘2’: [{'3': 3}, {'4': [{'11': 11, ‘12’: 12}, {}]}, {}], ‘5’: 5}]
В выводе видно, что есть пустые словари: {}
Подскажите, плиз, как избавиться от них?