Сравнение двух списков словарей и создание отфильтрованного списка словарей

есть два списка:

old_list = [{'good':'apple','from':'Amazon','to':'Avito','quantity': 103},
            {'good':'orange','from':'Ozon','to':'Avito','quantity': 107},
            {'good':'melon','from':'WB','to':'Ozon','quantity': 105},
            {'good':'apple','from':'WB','to':'Avito','quantity': 107}]
new_list = [{'good':'orange','from':'Ozon','to':'Avito','quantity': 120},
            {'good':'apple','from':'Amazon','to':'Avito','quantity': 104},
            {'good':'banana','from':'Amazon','to':'WB','quantity': 110},
            {'good':'apple','from':'WB','to':'Avito','quantity': 102}]

Входные списки содержат маршруты перевозки фруктов из одного магазина в другой. Нужна функция, которая сравнит эти списки и создаст отфильтрованный список маршрутов. Условия добавления маршрута в отфильтрованный список:

  1. совпадают значения по ключу 'good', 'from', 'to' и количество увеличилось на 5+ единиц,
  2. Новый маршрут, то есть маршрута нет в старом списке (old_list), (маршрут определяется товаром и двумя магазинами

Таким образом выходными данными функции будет список словарей:

filtered_list = [
                 {'good':'orange','from':'Ozon','to':'Avito','quantity': 120}, #изменилось количество больше чем на 5
                 {'good':'banana','from':'Amazon','to':'WB','quantity': 110} #новый маршрут
                ]

Отсеяли маршрут {'good':'apple','from':'Amazon','to':'Avito','quantity': 104}, так как увеличение количества менее 5 и {'good':'apple','from':'WB','to':'Avito','quantity': 101}, так как количество снизилось


Ответы (1 шт):

Автор решения: Ssssemyon
def filter_routes(old_list, new_list):
    filtered_list = []
    for new_route in new_list:
        is_new_route = True
        for old_route in old_list:
            if new_route['good'] == old_route['good'] and new_route['from'] == old_route['from'] and new_route['to'] == old_route['to']:
                if new_route['quantity'] > old_route['quantity'] + 5:
                    filtered_list.append(new_route)
                is_new_route = False
                break
        if is_new_route:
            filtered_list.append(new_route)
    return filtered_list
→ Ссылка