Получение среднего 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 шт):
попробуйте так:
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
Если я правильно понял:
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]