Нужно создать слоистый дикт из плоского - PullRequest
8 голосов
/ 23 сентября 2008

У меня есть диктат, который выглядит так:

{
    'foo': {
        'opt1': 1,
        'opt2': 2,
        },
    'foo/bar': {
        'opt3': 3,
        'opt4': 4,
        },
    'foo/bar/baz': {
        'opt5': 5,
        'opt6': 6,
        }
    }

И мне нужно, чтобы он выглядел так:

{
    'foo': {
        'opt1': 1,
        'opt2': 2,
        'bar': {
            'opt3': 3,
            'opt4': 4,
            'baz': {
                'opt5': 5,
                'opt6': 6,
                }
            }
        }
    }

Я должен указать, что может быть и будет несколько ключей верхнего уровня (в данном случае 'foo'). Возможно, я мог бы собрать что-нибудь вместе, чтобы получить то, что мне нужно, но я надеялся, что есть решение, которое будет более эффективным.

Ответы [ 3 ]

8 голосов
/ 23 сентября 2008

Как это:

def nest(d):
    rv = {}
    for key, value in d.iteritems():
        node = rv
        for part in key.split('/'):
            node = node.setdefault(part, {})
        node.update(value)
    return rv
1 голос
/ 23 сентября 2008
def layer(dict):
  for k,v in dict:
    if '/' in k:
      del dict[k]
      subdict = dict.get(k[:k.find('/')],{})
      subdict[k[k.find('/')+1:]] = v
      layer(subdict)
0 голосов
/ 23 ноября 2017

Получите эту библиотеку, чтобы лучше распечатать ваш диктат. pprint. https://docs.python.org/3.2/library/pprint.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...