Récursive diff de deux dictionnaires python (les clés et les valeurs)

J'ai donc un dictionnaire python, appeler d1, et une version de ce dictionnaire à un point plus tard dans le temps, de l'appeler d2. Je veux trouver tous les changements entre d1 et d2. En d'autres termes, tout ce qui a été ajouté, supprimé ou modifié. Le problème est que les valeurs peuvent être des entiers, des chaînes, des listes ou des dicts, donc il doit être récursive. C'est ce que j'ai à ce jour:

def dd(d1, d2, ctx=""):
    print "Changes in " + ctx
    for k in d1:
        if k not in d2:
            print k + " removed from d2"
    for k in d2:
        if k not in d1:
            print k + " added in d2"
            continue
        if d2[k] != d1[k]:
            if type(d2[k]) not in (dict, list):
                print k + " changed in d2 to " + str(d2[k])
            else:
                if type(d1[k]) != type(d2[k]):
                    print k + " changed to " + str(d2[k])
                    continue
                else:
                    if type(d2[k]) == dict:
                        dd(d1[k], d2[k], k)
                        continue
    print "Done with changes in " + ctx
    return

Il fonctionne très bien, sauf si la valeur est une liste de. Je ne peux pas tout à fait avec une élégante façon de traiter avec les listes, sans avoir une énorme, une version légèrement révisée de cette fonction répété après un if(type(d2) == list).

Toutes les pensées?

EDIT: Ce qui diffère de l' ce post parce que les touches peuvent changer

  • Exemple: list1 = [0, 1, 2, 3, 4, 5, 6, 7], list2 = [0, 2, 3, 4, 5, 6, 7, 8]. Ce que la sortie ne vous attendez-vous?
  • Si ils étaient sous la même clé dans 2 différents dicts, je pense que: 1 supprimé; 8 ajouté (sous la même clé). Si ils étaient sous différentes touches, puis ils sont de différents éléments.
  • Cela peut rapidement devenir difficile. N'est de l'ordre de la matière? Que faire si 8 est déplacé vers l'avant: [8, 1, 2, 3, 4, 5, 6, 7], qui n'ordonne pas pris en compte, ou seulement de la présence/absence (un ensemble)? La liste contient un imbriquée dictionnaire, qui contient à son tour une liste, etc?
  • Pouvez-vous donner un exemple de la sortie échoue sur?
  • Yup. Les listes peuvent contenir des dictionnaires, qui ne peut en contenir.... ses tortues tout le chemin vers le bas. Je n'ai pas vraiment besoin de tuples, mais à ce point, qui ne vous aide pas beaucoup
  • sûr: d1={"name":"Joe", "Animaux de compagnie":[{"name":"point", "espèces":"chien"}]}; d2={"name":"Joe", "Animaux de compagnie":[{"name":"point", "espèces":"chat"}]}
  • Juste par curiosité, Pourquoi la profusion de types? Serait-il possible qu'il existe une meilleure structure de données pour votre problème?
  • Je suis le stockage de ces dicts dans mongodb, et l'application doit être en mesure de pousser des objets imbriqués dans des objets

InformationsquelleAutor Alex | 2011-05-05