Python - вычислить среднее значение целых чисел в словарных значениях (вложенные списки) - PullRequest
0 голосов
/ 18 сентября 2018

Трудно описать мой вопрос словами, вот простой пример того, что я пытаюсь сделать.

У меня есть словарь ...

aDict= {'user1':[[1,2,3],[4,5,6]], 'user2': [[2,3,4],[5,6,7]]}

Я хочу вычислить средние числа в одном и том же индексе во вложенном цикле.

Идеальный результат, который я хотел бы получить, это ...

anotherDict = {'user' : [[1.5 , 2.5 , 3.5 ],[ 4.5 , 5.5 , 6.5 ]]}

1,5 = среднее значение 1 из ключа-user1.values ​​[0] [0] и 2 из ключа-user2.values ​​[0] [0] 2.5 = среднее значение 2 из ключа-user1.values ​​[0] [1] и 3 из ключа-user2.values ​​[0] [1] ... скоро... 6.5 = среднее значение 6 из ключа-user1.values ​​[1] [2] и 7 из ключа-user2.values ​​[1] [2]

Я действительно новичок в python, и я действительно извиняюсь за трудное объяснение моей проблемы.

Спасибо за помощь заранее.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

map + способ понимания списка решения @ schwobaseggl:

print([list(map(lambda x: sum(x)/len(x),zip(*v))) for v in zip(*aDict.values())])

И присвоить его новому дикту:

d={'user':[list(map(lambda x: sum(x)/len(x),zip(*v))) for v in zip(*aDict.values())]}

Или map + mapспособ решения @ schwobaseggl:

print(list(map(lambda v: list(map(lambda x: sum(x)/len(x),zip(*v))),zip(*aDict.values()))))

И присвоить его новому дикту:

d={'user':list(map(lambda v: list(map(lambda x: sum(x)/len(x),zip(*v))),zip(*aDict.values())))}

Выполнить from __future__ import division, если версия ниже 3 и выше 2.2, чтобы получить стиль Python 3деление

Все они выводят:

[[1.5, 2.5, 3.5], [4.5, 5.5, 6.5]]
0 голосов
/ 18 сентября 2018

Вы можете использовать следующее вложенное понимание, используя множество zip(*...) транспонирования:

aDict= {'user1':[[1,2,3],[4,5,6]], 'user2': [[2,3,4],[5,6,7]]}
[[sum(x)/len(x) for x in zip(*vals)] for vals in zip(*aDict.values())]
# [[1.5, 2.5, 3.5], [4.5, 5.5, 6.5]]

В Python2 вам потребуется принять некоторые меры для получения значений float, например:

[[1.0*sum(x)/len(x) for x in zip(*vals)] for vals in zip(*aDict.values())]
...