Ответ 1
Как я объяснил в другом вопросе, для этой задачи есть библиотека на PyPI, которая библиотека datadiff. Он прост в использовании, и вы можете использовать вывод, чтобы делать то, что вам нужно.
Я пытаюсь понять разницу в dict, было ли что-то добавлено или удалено и от чего.
Вот пример, в который добавлено значение:
original = {0: None, 1: False, 2: [16]}
new = {0: None, 1: False, 2: [2, 16]}
difference = True, {2: 2} # True = Added
И вот случай, когда значение удаляется:
original = {0: None, 1: False, 2: [16, 64]}
new = {0: None, 1: False, 2: [64]}
difference = False, {2: 16} # False = Removed
Проблема в том, что я понятия не имею, как получить разницу. Кто-нибудь будет знать, как достичь такого результата?
Дополнительная информация (не знаю, если вам это понадобится):
Как я объяснил в другом вопросе, для этой задачи есть библиотека на PyPI, которая библиотека datadiff. Он прост в использовании, и вы можете использовать вывод, чтобы делать то, что вам нужно.
Я считаю это вполне читаемым:
def dict_diff(left, right):
diff = dict()
diff['left_only'] = set(left) - set(right)
diff['right_only'] = set(right) - set(left)
diff['different'] = {k for k in set(left) & set(right) if left[k]!=right[k]}
return diff
>>> d1 = dict(a=1, b=20, c=30, e=50)
>>> d2 = dict(a=1, b=200, d=400, e=500)
>>> dict_diff(d1, d2)
{'different': {'b', 'e'}, 'left_only': {'c'}, 'right_only': {'d'}}
Вот ссылка на функцию, которая может генерировать "diff" из двух словарей, а затем дополнительные комментарии/примеры кода:
http://code.activestate.com/recipes/576644-diff-two-dictionaries/
вы можете временно передать dic [2] на set
в python и использовать -
, чтобы получить разницу
Что-то вроде:
def diff(a,b):
ret_dict = {}
for key,val in a.items():
if b.has_key(key):
if b[key] != val:
ret_dict[key] = [val,b[key]]
else:
ret_dict[key] = [val]
for key,val in b.items():
ret_dict.setdefault(key,[val])
return ret_dict
Это можно сделать в одной строке.
[b[k] for k in a.keys() if not k in b]