Преобразование строки во вложенный словарь - PullRequest
0 голосов
/ 29 января 2020

У меня есть строка, которую я хочу преобразовать во вложенный словарь в Python.

Пример ввода:

import copy
diff_str = "/pathConstraint/latency/latencyValue"
value = "low"
diff_arr = diff.split("/")
final_temp_dict = dict()
for elem in reversed(diff_arr):
    if len(final_temp_dict) == 0:
        final_temp_dict.setdefault(elem, value)
    else:
        temp_final_dict = copy.deepcopy(final_temp_dict)
        final_temp_dict.setdefault(elem, temp_final_dict)
    print (final_temp_dict)

При выполнении этого я сталкиваюсь с ошибкой, и я не получается ожидаемый вывод.

Требуется вывод в виде вложенного словаря:

{"pathConstraint" : {"latency" : {"latencyValue" : "low"}}}

Ответы [ 5 ]

3 голосов
/ 29 января 2020

Вы можете использовать следующую рекурсивную функцию:

def string_to_dict(keys, value):
    key = keys.split('/')
    if len(key) == 2:
        return {key[1]: value}
    else:
        return string_to_dict('/'.join(key[:-1]), {key[-1]: value})

Вывод:

>>> string_to_dict(diff_str, value)
{'pathConstraint': {'latency': {'latencyValue': 'low'}}}

Обратите внимание, что это предполагает, что diff_str начинается с / персонаж.

1 голос
/ 29 января 2020

Короче рекурсивный подход:

def to_dict(d, v):
  return v if not d else {d[0]:to_dict(d[1:], v)}


diff_str = "/pathConstraint/latency/latencyValue"
value = "low"
print(to_dict(list(filter(None, diff_str.split('/'))), value))

Выход:

{'pathConstraint': {'latency': {'latencyValue': 'low'}}}
0 голосов
/ 29 января 2020
def convert(items, value):
    if not items:
        return value

    return {items.pop(0): convert(items, value)}


print(convert(diff_str.strip('/').split('/'), 'low'))
0 голосов
/ 29 января 2020

Я пытался изменить вашу функцию как можно меньше, это должно работать просто отлично

import copy
def func():
    diff_str = "/pathConstraint/latency/latencyValue"
    value = "low"
    diff_arr = diff_str.split("/")
    final_temp_dict = dict()
    for elem in reversed(diff_arr):
        if elem == "":
            continue
        if len(final_temp_dict) == 0:
           final_temp_dict[elem] = value
        else:
           temp_final_dict = copy.deepcopy(final_temp_dict)
           final_temp_dict = {}
           final_temp_dict[elem] = temp_final_dict

    print (final_temp_dict)

Однако, есть гораздо более приятные способы сделать что-то подобное. См. Другие ответы для вдохновения.

0 голосов
/ 29 января 2020

Ниже приведен итеративный подход. Примечание diff_arr[1:] используется для исключения пустой строки, которая генерируется при разбиении на начальные /.

diff_str = "/pathConstraint/latency/latencyValue"
value = "low"
diff_arr = diff_str.split("/")
for key in list(reversed(diff_arr[1:])):
    value = {key: value}
print(value)

Выходные данные

{'pathConstraint': {'latency': {'latencyValue': 'low'}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...