Предполагая, что дикты выстраиваются, как в вашем примере ввода, вы можете использовать функцию zip()
, чтобы получить список связанных пар диктов, затем вы можете использовать any()
, чтобы проверить, есть ли разница:
>>> list_1 = [{'unique_id':'001', 'key1':'AAA', 'key2':'BBB', 'key3':'EEE'},
{'unique_id':'002', 'key1':'AAA', 'key2':'CCC', 'key3':'FFF'}]
>>> list_2 = [{'unique_id':'001', 'key1':'AAA', 'key2':'DDD', 'key3':'EEE'},
{'unique_id':'002', 'key1':'AAA', 'key2':'CCC', 'key3':'FFF'}]
>>> pairs = zip(list_1, list_2)
>>> any(x != y for x, y in pairs)
True
Или получить отличающиеся пары:
>>> [(x, y) for x, y in pairs if x != y]
[({'key3': 'EEE', 'key2': 'BBB', 'key1': 'AAA', 'unique_id': '001'}, {'key3': 'EEE', 'key2': 'DDD', 'key1': 'AAA', 'unique_id': '001'})]
Вы можете даже получить ключи, которые не совпадают для каждой пары:
>>> [[k for k in x if x[k] != y[k]] for x, y in pairs if x != y]
[['key2']]
Возможно вместе со связанными значениями:
>>> [[(k, x[k], y[k]) for k in x if x[k] != y[k]] for x, y in pairs if x != y]
[[('key2', 'BBB', 'DDD')]]
ПРИМЕЧАНИЕ: Если ваши входные списки еще не отсортированы, вы также можете сделать это легко:
>>> from operator import itemgetter
>>> list_1, list_2 = [sorted(l, key=itemgetter('unique_id'))
for l in (list_1, list_2)]