В примере отклонения равны 0, 5 и 10, общая сумма — 15. Указанные 75 и diff=40 ошибочны; сравнивать нужно суммы одного client_id.
Определение отклонений сумм по клиентам
В примере отклонения равны 0, 5 и 10, общая сумма — 15. Указанные 75 и diff=40 ошибочны; сравнивать нужно суммы одного client_id.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Имеются два упорядоченных массива словарей list1 и list2. Каждый элемент хранит идентификатор клиента (client_id) и его финансовую величину (sum). Нужно сопоставить записи из обоих массивов по полю client_id, вычислить абсолютную разницу сумм для каждого клиента и подсчитать суммарное значение всех отклонений. После этого требуется сформировать список из десяти клиентов, у которых разница максимальна по модулю.
list1 = [
{'client_id': 1, 'sum': 10},
{'client_id': 2, 'sum': 20},
{'client_id': 3, 'sum': 40},
]
list2 = [
{'client_id': 1, 'sum': 10},
{'client_id': 2, 'sum': 25},
{'client_id': 3, 'sum': 30},
]
# Ожидаемый результат:
# общая сумма отклонений: 5 + 40 + 30 = 75
# top10:
top10 = [
{'client_id': 3, 'diff': 40},
{'client_id': 2, 'diff': 5},
{'client_id': 1, 'diff': 0},
]
list1 = [
{'client_id': 1, 'sum': 10},
{'client_id': 2, 'sum': 20},
{'client_id': 3, 'sum': 40},
]
list2 = [
{'client_id': 1, 'sum': 10},
{'client_id': 2, 'sum': 25},
{'client_id': 3, 'sum': 30},
]
Ответ
В примере отклонения равны 0, 5 и 10, общая сумма — 15. Указанные 75 и diff=40 ошибочны; сравнивать нужно суммы одного client_id.
При уникальных идентификаторах и трактовке отсутствующей записи как нулевой суммы:
from heapq import nlargest
def differences(list1, list2):
first = {row['client_id']: row['sum'] for row in list1}
second = {row['client_id']: row['sum'] for row in list2}
if len(first) != len(list1) or len(second) != len(list2):
raise ValueError('Повторный client_id')
rows = [{'client_id': key, 'diff': abs(first.get(key, 0) - second.get(key, 0))}
for key in first.keys() | second.keys()]
top = nlargest(10, rows, key=lambda row: (row['diff'], -row['client_id']))
return sum(row['diff'] for row in rows), top
Топ примера: клиент 3 с разницей 10, клиент 2 с 5, клиент 1 с 0. Если массивы отсортированы по ID, их можно слить двумя указателями, сохраняя только сумму и кучу из десяти элементов.