Получение среднего n-ых элементов списка и особое преобразование

(заголовок только для факта) хватит минусить, если не можете понять

В общем есть 2 списка одинаковой длины:

list-1 = [0, 1,2,3,4,5,6,7,8,9]
list-1v2 = [-4.3,3.5,2.9,9.6,-2.4,1.9,6.4,7.1,-7.2,0.2]  
list-2 =   [   5,  1,  2,  4,   5,  1,  3,  5,   3,  1]

1-ый со всякими числами, 2-ой имеет одинаковые значения.
Upd: добавил более показательный список (list-1v2), остальные примеры основаны на list-1 и list-2
(list-1 содержит конечное количество уникальных рациональных чисел, не важно что означающих; list-2 содержит конечное количество положительных рациональных чисел, также не важно что означающих. Для простоты примера их по 10 неотрицательных в диапазоне от 0 до 10. Собственно, для понимания сути вопроса всё касаемо содержимого их было сообщено за скобками, а это даже лишнее)

Необходимо найти средние элементов 1-го списка, которые имеют одно и тоже значение во втором на соотв. позициях.

Т.е. одно среднее от 0,4,7 (=3.66...), другое от 1,5,9 (=5), третье от 6,8 (=7).

И затем так преобразовать пару списков, чтобы сохранилось позиционирование усреднённого значения из 1-го списка относительно значения, на основании которого производилось усреднение, из 2-го списка.

Т.е. ожидаемые результаты (любой из них):

a) list-1 = [3.66, 5, 2, 3, 7]
   list-2 = [   5, 1, 2, 4, 3]
   (тут я предполагал замену первого встречного)

b) list-1 = [2, 3, 3.66, 5, 7]
   list-2 = [2, 4,    5, 1, 3]
   (а тут конечную вставку)

или ещё любые комбинации, с сохранением вертикального соответствия 2-2, 3-4, 5-1, 7-3, 3.66-5, но желательней, что бы оба были отсортированы по 1-му, т.е. как раз как в b (для лучшего понимания добавил пробелов).

Пробовал некоторым способом, в котором встал в тупик при преобразовании списков, а т.к. хотелось бы получить полноценное решение по лучше, вопрос без неудачного кода. И прошу воздержаться от выклянчивания его.

Upd: Суть вопроса: Какой код позволит получить

усредняющим "сжатием" (сжатие т.к. длина списков уменьшается) тех элементов 1-го списка, которые имеют "под собой" (во 2-ом списке) одно и тоже число (например 5 (из 2-го) для 0,4,9 (из 1-го)

из начальной пары списков конечную.

улучшенное мной решение MBo здесь:

from collections import defaultdict
from statistics import mean

def AvgComprss(l1,l2):
    D = defaultdict(list)
    for i, v in enumerate(l1):
        D[v].append(l2[i])
    D = [[n, mean(D[n])] for n in D]
    return map(list, zip(*sorted(D)))

list-1 = [0,1,2,3,4,5,6,7,8,9]
list-2 = [5,1,2,4,5,1,3,5,3,1]
list-2, list-1 = AvgComprss(list-2, list-1)
print(list-1)
print(list-2)

Выводит:
[5, 2, 7, 3, 3.6666666666666665]
[1, 2, 3, 4, 5]

Это потенциально лучшее исполнение решения задачи.


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

Автор решения: Danis

попробуйте так:

def f(arr1, arr2):
    res1, res2 = [], []
    
    for el in sorted(set(arr2), key=arr2.index):
        arr = [i for i in range(len(arr2)) if arr2[i] == el]
        res1.append(sum(arr) / len(arr))
        res2.append(el)
        
    return res1, res2
→ Ссылка
Автор решения: MBo

Если я правильно понял:

la = [0,1,2,3,4,5,6,7,8,9]
lb = [5,1,2,4,5,1,3,5,3,1]
dic = dict()
for i in range(len(lb)):
    if lb[i] in dic:
        dic[lb[i]].append(la[i])
    else:
        dic[lb[i]] = [la[i]]
lc = []
for x in dic:
    ls = dic[x]
    m = sum(ls) / len(ls)
    lc.append((m, x))
lc.sort()
aa, bb = map(list, zip(*lc))
print(aa)
print(bb)

 >>>>
[2.0, 3.0, 3.6666666666666665, 5.0, 7.0]
[2, 4, 5, 1, 3]
→ Ссылка