Распечатать / Получить полный путь каждого вложенного элемента в словаре - Python3 - PullRequest
1 голос
/ 22 марта 2020

У меня есть многослойный, вложенный python словарь. Я пытаюсь преобразовать этот словарь в строку, которая выглядит как человеческий python код. Я искал stackoverflow для решения, но не смог найти подходящее - пожалуйста, укажите одно, если оно отвечает на мой вопрос.

Примечания:

1) Некоторые имена ключей повторяются на разных глубинах в вложенном словаре

2) Сам словарь может изменять форму, содержимое и, возможно, даже имена ключей, поэтому этот сценарий должен работать для разных случаев

3) Чтобы упростить эту проблему, я преобразовал все вложенные списки в словари - ключи для этих словарей - числа, преобразованные в строковый тип - однако решение, которое использует вложенные списки, хорошо

Цель состоит в том, чтобы преобразовать:

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',
                },
            },
        },
    },
}

в строку:

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

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

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)

, что приводит к:

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 Ответ

1 голос
/ 22 марта 2020

вы не должны накапливать в переменной my_keys все ключи, а вместо этого создавать новую строку, основанную только на текущем ключе из вашего текущего диктанта:

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)

вывод:

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

если вы хотите, чтобы ваша функция возвращала список с вашими строками, вы можете использовать:

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)

output:

['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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...