Python de manière récursive remplacer des caractères dans les touches de imbriquée dictionnaire?

Je suis en train de créer une fonction générique qui remplace les points clés d'une imbriqués dictionnaire. J'ai un non-fonction générique qui va de 3 niveaux de profondeur, mais il doit y avoir un moyen de faire ce générique. Toute aide est appréciée! Mon code pour l'instant:

output = {'key1': {'key2': 'value2', 'key3': {'key4 with a .': 'value4', 'key5 with a .': 'value5'}}} 

def print_dict(d):
    new = {}
    for key,value in d.items():
        new[key.replace(".", "-")] = {}
        if isinstance(value, dict):
            for key2, value2 in value.items():
                new[key][key2] = {}
                if isinstance(value2, dict):
                    for key3, value3 in value2.items():
                        new[key][key2][key3.replace(".", "-")] = value3
                else:
                    new[key][key2.replace(".", "-")] = value2
        else:
            new[key] = value
    return new

print print_dict(output)

Mise à JOUR: pour répondre à ma propre question, j'ai fait une solution en utilisant json object_hooks:

import json

def remove_dots(obj):
    for key in obj.keys():
        new_key = key.replace(".","-")
        if new_key != key:
            obj[new_key] = obj[key]
            del obj[key]
    return obj

output = {'key1': {'key2': 'value2', 'key3': {'key4 with a .': 'value4', 'key5 with a .': 'value5'}}}
new_json = json.loads(json.dumps(output), object_hook=remove_dots) 

print new_json
  • Toanswer à votre propre question, vous répondez à votre propre question, pas de le modifier.
  • Utiliser ma solution parce que ma solution est dix fois plus rapide.
  • plus rapide mais mal
  • Bon moyen de le faire. Le object_hook vraiment simplifie l'ensemble de la chose, surtout dans mon cas où j'utilise une "clé" nommé "inclure" où il a besoin de façon récursive de la charge supplémentaire des fichiers JSON pour former un seul multidimensionnelle dictionnaire.
  • Pour des raisons inexplicables, ce object_hook à l'aide de la méthode ci-dessus remove_dots() seulement remplacé quelques-uns des principaux noms. J'ai certains ce qui a permis à point. Est-il possible que cela soit lié à une étrange commande de problème dans le fichier obj.les touches de fonction ()? Je dois faire un commandés dict? Je pensais que Python3 n'ai pas eu le dict de la commande de problème?