Преобразовать вложенный словарь в строку - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь добиться следующего:

Input = {
    'key1':{'key11':'val11', 'key12':'val12'},
    'key2':{'key21':{'key211':'val211', 'key212':'val212'}},
    'key3':'val3',
    'key4':{'key41':'val41', 'key42':'val42'}
}

Выход =

1) Если значение является словарем, то создать выходную строковую переменную =

key1 { key11 val11 key12 val12 } key2 { key21 { key211 val211 key212 val212 }} key4 { key41 val41 key42 val42}

2) Если значение не является словарем, выведите "just a string element"

Ниже мой код:

from collections import defaultdict

def stringBuilder(dictionary):
    stringOption = ""
    innerString = ""
    # print dictionary
    for key, value in dictionary.iteritems():
        if isinstance(value, dict):
            stringBuilder(value)
        else:
            innerString = innerString + " " + str(key) + " " + str(value)
            print innerString
            stringOption = "{" + innerString + " }"
            print stringOption
    return stringOption

d = {'key1':{'key11':'val11', 'key12':'val12'}, 'key2':{'key21':{'key211':'val211', 'key212':'val212'}}, 'key3':'val3', 'key4':{'key41':'val41', 'key42':'val42'}}
print d
stringOption = ""
for key, value in d.iteritems():
    if isinstance(value, dict):
        stringOption = stringOption + " " + str(key) + " " + stringBuilder(value)
        print stringOption
    else:
        print "just a string element"
print stringOption

Вот вывод, который я получаю:

{'key2': {'key21': {'key211': 'val211', 'key212': 'val212'}}}
 key211 val211
{ key211 val211 }
 key2 
 key2 

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Вместо того, чтобы писать собственную реализацию (если это не то, что вам нужно), почему бы не использовать библиотеку json ? Вы можете расширить JSONEncoder и JSONDecoder в соответствии с вашим вариантом использования?

0 голосов
/ 02 мая 2018

Отличное рекурсивное упражнение!

def rec(x):
    # assuming values are either str or otherwise dict
    if isinstance(x, str):
        return x
    return '{' + ' '.join([k + ' ' + rec(v) for (k, v) in x.items()]) + '}'


Input = {
    'key1':{'key11':'val11', 'key12':'val12'},
    'key2':{'key21':{'key211':'val211', 'key212':'val212'}},
    'key3':'val3',
    'key4':{'key41':'val41', 'key42':'val42'}
}

Выход:

In [6]: rec(Input)
Out[6]: '{key1 {key11 val11 key12 val12} key2 {key21 {key211 val211 key212 val212}} key3 val3 key4 {key41 val41 key42 val42}}'
0 голосов
/ 01 мая 2018

Ваша основная проблема в том, что вы отбрасываете возвращенную строку вашего dict дела:

    if isinstance(value, dict):
        stringBuilder(value)

Вместо этого попробуйте сохранить значение, чтобы передать обратно строку:

    if isinstance(value, dict):
        stringOption = stringBuilder(value)

Результирующий вывод:

key2 { key211 val211 key212 val212 } key1 { key12 val12 key11 val11 } key4 { key41 val41 key42 val42 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...