J'ai un dictionnaire, python imbriqué multi-couches. Je suis en train de convertir ce dictionnaire en une chaîne qui ressemble à code python écrit-humain. J'ai écumé stackoverflow une solution mais ne pouvait pas trouver celui qui convient - s'il vous plaît faire un point si elle répond à ma question.
Remarques:
1) Certains noms clés sont répétées à différentes profondeurs dans le dictionnaire imbriqué
2) Le dictionnaire lui-même peut changer de forme, le contenu, et peut-être même des noms clés, donc ce script devrait fonctionner pour différents cas
3) Pour simplifier ce problème, je me suis converti toutes les listes imbriquées dans les dictionnaires - les clés de ces dictionnaires sont des nombres convertis en un type de chaîne - mais une solution qui utilise des listes imbriquées est correct
L'objectif est de convertir:
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',
},
},
},
},
}
dans une chaîne:
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
J'ai créé cette fonction récursive qui se rapproche, mais comprend des touches supplémentaires de façon inappropriée:
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)
résultant en:
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
vous ne devriez pas accumuler dans la my_keys
variable toutes les clés, mais au lieu de créer une nouvelle base de chaîne uniquement sur la clé actuelle de votre dict actuelle:
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)
production:
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
si vous voulez que votre fonction pour retourner une liste avec vos chaînes que vous pouvez utiliser:
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)
production:
['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']