diff --git a/forest.py b/forest.py new file mode 100644 index 0000000..7aab431 --- /dev/null +++ b/forest.py @@ -0,0 +1,72 @@ +""" +Есть абстрактная задача: + +У нас есть лес из json массива + +Гораздо дешевле в качестве транспорта их передавать в виде списка кортежей + +(вида ключ: значение), + +(ключ.ключ: значение) + +Пример: +""" +import json +from typing import Any, List, Tuple + +forest = {'b': 1, + 'c': {'d': 2, + 'f': 3, + }, + 'e': {'i': 4, + 'j': {'k': 5, + 'l': 6, + }, + }, + 'm': {'n': 7, + 'o': {'p': 8, + 'r': {'s': 9, + 't': 10, + }, + }, + }, + } + +# Переводим в такой вид: +result = [('b', 1), ('c.d', 2), ('c.f', 3), ('e.i', 4), ('e.j.k', 5), ('e.j.l', 6), ('m.n', 7), + ('m.o.p', 8), ('m.o.r.s', 9), ('m.o.r.t', 10), ] + + +def dict_to_list(sub_tree: dict, current_name: str, items_list: List[tuple]) -> List[tuple]: + + for key in sub_tree: + if isinstance(sub_tree[key], dict): + dict_to_list(sub_tree=sub_tree[key], current_name=current_name + key, items_list=items_list) + else: + items_list.append(('.'.join(current_name + key), sub_tree[key])) + return items_list + + +res = dict_to_list(forest, '', []) +print(res) + + +# Reverse task: + + +def list_to_dict(data: List[Tuple['str', int]]) -> dict: + tree = {} + for item in data: + curr_tree = tree + keys = item[0].split('.') + for i in range(0, len(keys)): + if i == len(keys) - 1: + curr_tree[keys[i]] = item[1] + elif keys[i] not in curr_tree: + curr_tree[keys[i]] = {} + curr_tree = curr_tree[keys[i]] + return tree + + +parsed = json.dumps(list_to_dict(result), indent=4) +print(parsed)