Есть два некоторых словаря, которые объединяются в один. Далее общий словарь сортируется по возрастанию значений.
В копии отсортированного словаря все значения заменяются "рангами" - по сути номерами от 1 до длины словаря.
Но ранги у повторяющихся элементов должны исчисляться следующим образом: то значение, которое получает ключ в копии общего словаря складывается с остальными ключами, на месте которых были одинаковые значения и делятся на количество повторяющихся элементов. То есть среднее значение.
Например если повторяется значение 107 таким образом: 'a_3': 107, 'a_6': 107, 'a_8': 107, 'b_2': 107, при этом в general_row_copy 'a_3': 10, 'a_6': 11, 'a_8': 12, 'b_2': 13,
то вывестись должно: 'a_3': 11.5, 'a_6': 11.5, 'a_8': 11.5, 'b_2': 11.5
(10+11+12+13)/4
k1 = {"a_1":111, "a_2":104, "a_3":107, "a_4":90, "a_5":115, "a_6":107, "a_7":106, "a_8":107, "a_9":95, "a_10":116, "a_11":127, "a_12":115, "a_13":102, "a_14":99}
k2 = {"b_1":113, "b_2":107, "b_3":123, "b_4":122, "b_5":117, "b_6":112, "b_7":105, "b_8":108, "b_9":111, "b_10":114, "b_11":102, "b_12":104}
general_row = dict(sorted({**k1, **k2}.items(), key=lambda x: x[1]))
general_row_copy = general_row.copy()
k = 1
for key in general_row_copy:
general_row_copy[key] = k
k += 1
counter = 1
sum_of_rank = 0
print ((general_row_copy))