Eu tenho, um dicionário python aninhada em camadas-multi. Eu estou tentando converter este dicionário em uma string que se parece com código python escrito-humana. Eu percorri stackoverflow para uma solução, mas não conseguiu encontrar um que se encaixa - faça um ponto se ele responde a minha pergunta.
Notas:
1) Alguns nomes importantes são repetidos em diferentes profundidades no dicionário aninhado
2) O dicionário em si pode mudar de forma, conteúdo e nomes possivelmente até mesmo chave, portanto, este script deve funcionar para casos diferentes
3) Para simplificar esse problema, eu converti todas as listas aninhadas em dicionários - as chaves para estes dicionários são números convertidos para um tipo de corda - no entanto uma solução que usa aninhados listas está bem
O objetivo é converter:
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',
},
},
},
},
}
em uma string:
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
Eu criei esta função recursiva que se aproxima, mas inclui teclas extras de forma inadequada:
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)
resultando em:
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
você não deve se acumular no my_keys
variável todas as chaves, mas em vez de criar uma nova base de corda só sobre a chave atual do seu dict atual:
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)
resultado:
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
se você quiser a função para retornar uma lista com suas cordas você pode usar:
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)
resultado:
['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']