Как мне преобразовать ab c .d во что-то вроде этого {'a': {'b': {'c': {'d':}}}} в Python? - PullRequest
0 голосов
/ 23 марта 2020

Я написал логи c о том, как это сделать и вывести его, но я не могу закодировать эту структуру в циклическом / рекурсивном стиле.

string = "a.b.c.d"
parent = {}
keys = string.split(".")

parent[keys[0]] = dict()
parent[keys[0]][keys[1]] = dict()
parent[keys[0]][keys[1]][keys[2]] = dict()

Нижняя часть лога c должна быть закодирована:

parent[keys[0]] = dict()
parent[keys[0]][keys[1]] = dict()
parent[keys[0]][keys[1]][keys[2]] = dict()

and so on.....

Ответы [ 2 ]

2 голосов
/ 23 марта 2020

Вы можете просто использовать split('.', 1), чтобы последовательно отделить первую часть от остальных и передать ее в свой рекурсивный вызов:

def dictify(s):
  if '.' not in s:
    return s
  key, rest = s.split('.', 1)
  return {key: dictify(rest)}

Тестирование:

>>> dictify('a.b.c.d')
{'a': {'b': {'c': 'd'}}}

Если вы хотите, чтобы на последнем уровне также был пустой дикт, вместо того, чтобы быть просто значением, вы можете изменить return s в первой части на return {s: {}}

0 голосов
/ 23 марта 2020

Нерекурсивное решение:

s = "a.b.c.d"
root = None
parent = None
keys = s.split(".")

for key in keys:
    if (parent is None):
        root = {}
        parent = root
    d = {}
    parent[key] = d
    parent = d

print (root)

Вывод:

{'a': {'b': {'c': {'d': {}}}}}
...