Итак, у меня есть словарь python, назовите его d1
и версию этого словаря в более поздний момент времени, назовите его d2
. Я хочу найти все изменения между d1
и d2
. Другими словами, все, что было добавлено, удалено или изменено. Сложный бит заключается в том, что значения могут быть ints, строками, списками или dicts, поэтому он должен быть рекурсивным. Это то, что у меня есть до сих пор:
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
Он отлично работает, если значение не является списком. Я не могу придумать элегантный способ справиться со списками, без огромной, слегка измененной версии этой функции, повторяющейся после if(type(d2) == list)
.
Любые мысли?
EDIT: это отличается от this post, потому что клавиши могут изменять