Как преобразовать путь в json в python?

Я получаю значения в следующем формате

/a/b/c/d = "value1"
/a/b/e/f = "value2"

Я хочу, чтобы эти значения были в следующем формате.

{
    "a": {
        "b": {
            {
                "c": {
                    "d": "value1"
                }
            },
            {
                "e" {
                    "f": "value2"
                }
            }
        }
    }

}

Есть ли какие-либо встроенные функции в python, которые могут выполнять эту работу так же, как я? Такая структура невозможна в словаре python?

Простым подходом было бы рассмотреть это как проблему рекурсии для путей, а затем записать ее в словарь.

Abinav R 23.11.2022 10:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
67
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Выглядит немного хакерским, но если вы хотите пойти по маршруту a["b"]["c"]["d"], вы можете использовать для этого collections.defaultdict.

from collections import defaultdict

def defaultdict_factory():
    return defaultdict(defaultdict)

a = defaultdict(defaultdict_factory)

a["b"]["c"]["d"] = "value1"

Встроенных нет, но можно reduce каждое из этих выражений занести в словарь и потом получить их объединение.

from functools import reduce

data = """
/a/b/c/d = "value1"
/a/b/e/f = "value2"
"""

exp = dict()
for pathexp in data.strip().splitlines():
    # skip past first "/" to avoid getting an empty element
    path, value = pathexp.lstrip("/").rsplit(" = ", 1)
    exp.update(
        reduce(lambda x, y: {y: x}, reversed(path.split("/")),
               value.strip('"')))

print(exp)

Если бы вы действительно хотели, вы могли бы сложить это в одну строку с другим reduce вместо цикла; но если вы действительно не занимаетесь функциональным программированием, это уже довольно плотно.

Ответ принят как подходящий

Как было предложено в приведенном выше сообщении, я создал рекурсивную функцию, которая разделяет путь ["a/b/c"] и его значение ["value1"] и создает output_dict, который будет хранить все значения в формате json/dict.

resources = {"/a/b/c/d":"value1","/a/b/e/f":"value2"}
output_dict = {}

def create_nested_dict(path, value, output_dict):
    """Create a nested dictionary from the given path and value."""
    keys = path.split("/")
    if len(keys) == 1:
        output_dict[keys[0]] = value
    else:
        key = keys[0]
        if key not in output_dict:
            output_dict[key] = {}
        create_nested_dict("/".join(keys[1:]), value, output_dict[key])



for resource in resources:
    for path,value in resource.items():
        create_nested_dict(path[1:], value, output_dict)


Другие вопросы по теме