+-

我正在使用 DeepDiff.所以我的结果如下:
local = [{1: {'age': 50, 'name': 'foo'}}, {2: {'age': 90, 'name': 'bar'}}, {3: {'age': 60, 'name': 'foobar'}}]
online = [{1: {'age': 50, 'name': 'foo'}}, {2: {'age': 40, 'name': 'bar'}}]
ddiff = DeepDiff(local, online)
added, updated = ddiff['iterable_item_added'], ddiff['values_changed']
added = {'root[2]': {3: {'age': 60, 'name': 'foobar'}}}
updated = {"root[1][2]['age']": {'new_value': 90, 'old_value': 40}}
现在,我想采取:
list_indexes_added = foo(added)
list_indexes_updated = foo(updated)
并获得:
list_indexes_added = [2]
list_index_updated = [(1,2,'age')]
通过这种方式,我可以操作本地和在线列表,并在将来更新在线表.
我正在考虑正则表达式,但也许还有其他选择.
最佳答案
>一个解决方案可以是正则表达式和自定义解析匹配.
>另一个可以在对这些字符串进行正则表达式解析后使用literal_eval,如果deepdiff的输出格式是一致的
>另一个可以在对这些字符串进行正则表达式解析后使用literal_eval,如果deepdiff的输出格式是一致的
from ast import literal_eval
import re
def str_diff_parse(str_diff):
return [tuple(literal_eval(y) for y in re.findall(r"\[('?\w+'?)\]", x)) for x in str_diff]
added = {'root[2]': {3: {'age': 60, 'name': 'foobar'}}}
updated = {"root[1][2]['age']": {'new_value': 90, 'old_value': 40}}
list_indexes_added = str_diff_parse(added)
list_indexes_updated = str_diff_parse(updated)
print(list_indexes_added)
print(list_indexes_updated)
# prints
#[(2,)]
#[(1, 2, 'age')]
演示:http://ideone.com/3MhTky
>还会推荐dictdiffer模块,它将diff作为可消耗的python diff对象返回,可以将其修补到原始字典以获取更新的字典,反之亦然.
点击查看更多相关文章
转载注明原文:python – 解析DeepDiff结果 - 乐贴网