Mam wielowarstwowy, zagnieżdżonego słownika Pythona. Próbuję przekonwertować ten słownik do łańcucha, który wygląda jak napisany przez człowieka kod Python. Przeszukałem stackoverflow na rozwiązanie, ale nie mogłem znaleźć tego, który pasuje - proszę wskazać jeden, jeśli odpowiada na moje pytanie.

Uwagi:

1) Niektóre nazwy kluczy są powtarzane w różnych głębokościach w Głowcy Zagnieżdżonym

2) Sama słownik może zmienić kształt, treść i ewentualnie nawet nazwy kluczy, stąd ten skrypt powinien działać dla różnych przypadków

3) Aby uprościć ten problem, przekształciłem wszystkie zagnieżdżone listy w słowniki - Klawisze dla tych słowników są liczbami przekonwertowanymi na typ ciągu - jednak rozwiązanie używa zagnieżdżonych list jest w porządku

Celem jest konwersja:

sample_dictionary = {
    'id' : '123',
    'type' : 'testing',
    'records' : {
        '0' : {
            'record_id' : '324',
            'record_type' : 'test1',
        },
        '1' : {
            'record_id' : '121',
            'record_type' : 'test2',
            'sub_records' : {
                '0' : {
                    'sub_record_id' : 'sub_578',
                    'sub_record_type' : 'sub_test',
                },
            },
        },
    },
}

W ciąg:

sample_dictionary[id] = 123
sample_dictionary[type] = testing
sample_dictionary[records][0][record_id] = 324
sample_dictionary[records][0][record_type] = test1
sample_dictionary[records][1][record_id] = 121
sample_dictionary[records][1][record_id] = test2
sample_dictionary[records][1][sub_records][0][sub_record_id] = sub_578
sample_dictionary[records][1][sub_records][0][sub_record_type] = sub_test

Stworzyłem tę rekurencyjną funkcję, która zbliża się, ale zawiera dodatkowe klucze niewłaściwie:

def FindValues(dictionary, my_keys=''):

    for key, value in dictionary.items():

        my_keys += '[' + key + ']'

        if type(value) is dict:

            FindValues(value, my_keys)

        else: 

            result = 'sample_dictionary' + my_keys + ' = ' + value

            print(result)


FindValues(sample_dictionary)

W wyniku:

sample_dictionary[id] = 123
sample_dictionary[id][type] = testing
sample_dictionary[id][type][records][0][record_id] = 324
sample_dictionary[id][type][records][0][record_id][record_type] = test1
sample_dictionary[id][type][records][0][1][record_id] = 121
sample_dictionary[id][type][records][0][1][record_id][record_type] = test2
sample_dictionary[id][type][records][0][1][record_id][record_type][sub_records][0][sub_record_id] = sub_578
sample_dictionary[id][type][records][0][1][record_id][record_type][sub_records][0][sub_record_id][sub_record_type] = sub_test
1
Daniel 22 marzec 2020, 02:16

1 odpowiedź

Najlepsza odpowiedź

Nie powinieneś gromadzić się w my_keys zmiennej wszystkie klawisze, ale zamiast tego utworzyć nową podstawę ciągu tylko na bieżącym kluczu z bieżącego dyktatu:

def FindValues(dictionary, my_keys=''):

    for key, value in dictionary.items():

        current_key = my_keys + '[' + key + ']'

        if type(value) is dict:

            FindValues(value, current_key)

        else: 

            result = 'sample_dictionary' + current_key  + ' = ' + value

            print(result)

FindValues(sample_dictionary)

Wynik:

sample_dictionary[id] = 123
sample_dictionary[type] = testing
sample_dictionary[records][0][record_id] = 324
sample_dictionary[records][0][record_type] = test1
sample_dictionary[records][1][record_id] = 121
sample_dictionary[records][1][record_type] = test2
sample_dictionary[records][1][sub_records][0][sub_record_id] = sub_578
sample_dictionary[records][1][sub_records][0][sub_record_type] = sub_test

Jeśli chcesz, aby Twoja funkcja zwróciła listę za pomocą strun, których możesz użyć:

def FindValues(dictionary, my_keys=''):

    output = []

    for key, value in dictionary.items():

        current_key = my_keys + '[' + key + ']'

        if type(value) is dict:

            output += FindValues(value, current_key)

        else: 

            output.append('sample_dictionary' + current_key  + ' = ' + value)

    return output

FindValues(sample_dictionary)

Wynik:

['sample_dictionary[id] = 123',
 'sample_dictionary[type] = testing',
 'sample_dictionary[records][0][record_id] = 324',
 'sample_dictionary[records][0][record_type] = test1',
 'sample_dictionary[records][1][record_id] = 121',
 'sample_dictionary[records][1][record_type] = test2',
 'sample_dictionary[records][1][sub_records][0][sub_record_id] = sub_578',
 'sample_dictionary[records][1][sub_records][0][sub_record_type] = sub_test']
1
kederrac 22 marzec 2020, 09:24