Форум сайта python.su
Товарищи, добрый день.
Я получаю сложные структуры, которые могу являть собой разные сочетания вложенных словарей и списков друг в друга. Например, вот такие наборы:
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'}]
Отредактировано rick1177 (Июль 17, 2022 02:19:57)
Офлайн
a = [{'1': 1, "2": [{'3': 3}, {'4': [{'11': 11, '12': 12, 'attributes': 'pf'}, {'attributes': 'pf'}]}, {'attributes': 'pf'}], '5': 5, 'attributes': 'pf'}] def filter_data(data): if isinstance(data, list): return [val for i in data if (val := filter_data(i))] elif isinstance(data, dict): return {k: val for k, v in data.items() if k != 'attributes' and (val := filter_data(v))} else: return data print(filter_data(a))
[{'1': 1, '2': [{'3': 3}, {'4': [{'11': 11, '12': 12}]}], '5': 5}]
Офлайн
Добрый день.
Можно ли попросить вас пояснить эти строки:
xam1816return [val for i in data if (val := filter_data(i))]
xam1816В частности, первый раз вижу конструкцию:return {k: val for k, v in data.items() if k != 'attributes' and (val := filter_data(v))}
xam1816val := filter_data(i)
Отредактировано rick1177 (Июль 18, 2022 00:18:19)
Офлайн
VANISHED
Отредактировано ntram (Окт. 13, 2022 15:54:50)
Офлайн
rick1177без нее можно написать вот так
В частности, первый раз вижу конструкцию:
val := filter_data(i)
[filter_data(i) for i in data if filter_data(i)]
Офлайн
xam1816
без нее можно написать вот так:[filter_data(i) for i in data if filter_data(i)]
xam1816return {k: val for k, v in data.items() if k != 'attributes' and (val := filter_data(v))}
Отредактировано rick1177 (Июль 21, 2022 14:42:54)
Офлайн
xam1816Попытался сделать самостоятельно, но что-то не получается:
без нее можно написать вот так
def filter_data_2(data): if isinstance(data, list): return [filter_data(i) for i in data if filter_data(i)] elif isinstance(data, dict): return {k: filter_data(v) for k, v in data.items() if k != 'attributes' and (filter_data(v))} else: return data
tr {'1': 1, '2': [{'3': 3}, {'4': [{'11': 11, '12': 12}]}], '5': 5} {'1': 1, '2': [{'3': 3}, {'4': 4}], '5': 5} 5 {'4': 4} 4 5 6
return {k: val for k, v in data.items() if k != 'attributes' and (val := filter_data(v))}
Отредактировано rick1177 (Июль 22, 2022 00:12:50)
Офлайн