Сравните два списка словарей и выходные различия

1

У меня есть 2 списка dicts, которые мне нужно сравнить и вывести разницу для отчета

Мне необходимо:

  1. Проверьте new_list против old_list для новых записей (записей, которые существуют в new_list, но не в old_list), и добавьте их в updated_list
  2. Игнорировать соответствующие записи (все ключи, значения соответствуют)
  3. Найдите совпадающие записи с различными событиями15 или событием16 и обновите событие с разницей двух значений
  4. Вывести результаты в новый список dicts (updated_list в этом примере)

Обрабатывать:

new_list = [
{'datetime': '2018-08-01', 'evar1': 'newRecord', 'event16': '100', 'event15': '200'},
{'datetime': '2018-08-02', 'evar1': 'duplicateRecord', 'event16': '10', 'event15': '20'},
{'datetime': '2018-08-03', 'evar1': 'diffEvent', 'event16': '15', 'event15': '25'}
]

old_list = [
{'datetime': '2018-08-02', 'evar1': 'duplicateRecord', 'event16': '10', 'event15': '20'},
{'datetime': '2018-08-03', 'evar1': 'diffEvent', 'event16': '10', 'event15': '25'}
] 

Результаты должны выглядеть следующим образом:

updated_list = [
{'datetime': '2018-08-01', 'evar1': 'newRecord', 'evar3': 'site',  'event16': '100', 'event15': '200'},
{'datetime': '2018-08-03', 'evar1': 'diffEvent', 'evar3': 'site',  'event16': '5', 'event15': '25'}
]

Я попробовал это:

updated_list = []
for new_item in new_list:
    for old_item in old_list:
        for key, value in new_item.iteritems():
        # If values don't match, subtract old_list value from new_list values and append the diff
        if any(ko == key for ko, vo in old_item.iteritems()):
            ko, vo = [(ko, vo) for (ko, vo) in old_item.iteritems() if ko == key][0]
            if vo != value:
                new_value = value - vo
                new_item.update({ko: new_value})
                updated_list.append(new_item)
            else:
            # If record does not exist in old_list, append the new record
            updated_list.append(new_item)
  • 0
    Попробуйте использовать наборы и оператор - (минус), чтобы получить разницу.
  • 1
    @NChauhan Не будет работать с диктовками!
Показать ещё 2 комментария
Теги:
dictionary
python-2.7

1 ответ

1
Лучший ответ

Очень запутанная задача! Вот мое решение (комментарии должны объяснить метод).

#init a list to store the dictionaries
updated_list = []
#define our 'special keys'
events = ('event15', 'event16')
#remove duplicates from both lists (where all key, values match) - case (2)
old_list_no_dupes = [d for d in old_list if not any(d == dd for dd in new_list)]
new_list_no_dupes = [d for d in new_list if not any(d == dd for dd in old_list)]
for d in new_list_no_dupes:
    #iterate over all the dictionaries in old_list for case (3)
    for dd in old_list_no_dupes:
        #continue to next if not every pair (but event*) matches
        if any(k not in dd or dd[k] != v for k,v in d.items() if k not in events):
            continue
        #iterate the to event keys
        for k in events:
            #check both dictionaries have that key and they are different values
            if k in d and k in dd and d[k] != dd[k]:
                #update the new dictionary to be the absolute difference
                d[k] = str(abs(int(dd[k]) - int(d[k])))
    #append our new dictionary - cases (1), (3) and (4)
    updated_list.append(d)

[{'datetime':'2018-08-01', 'evar1':'newRecord', 'event16':'100', 'event15': '200'},
 {'datetime':'2018-08-03', 'evar1':'diffEvent', 'event16':'5',   'event15': '25'}]
  • 0
    Я согласен, что это была очень запутанная задача, и я не решался спросить на этом форуме. Но ваше решение работает отлично, и я вижу, где я был вне цели. Еще раз члены стека имеют ответ. Спасибо, Джо !!!
  • 0
    @GreetRufus Нет проблем! Пожалуйста, примите ответ :) (это небольшая галочка)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню