用语言描述我的问题非常困难,所以这是我要做什么的一个简单示例。
我有字典...
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 = key-user1.values [0] [0]的平均值为1,key-user2.values [0] [0]的平均值为2 2.5 =来自key-user1.values [0] [1]的平均值2和来自key-user2.values [0] [1]的平均值3 ...等等 6.5 =来自key-user1.values [1] [2]的平均值为6,来自key-user2.values [1] [2]的平均值为7
我真的是python新手,对于这个问题的困难解释,我深表歉意。
非常感谢您的帮助。
答案 0 :(得分:3)
您可以通过许多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())]
答案 1 :(得分:0)
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())]}
或者@schwobaseggl解决方案的map
+ map
方法:
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())))}
如果版本低于3且高于2.2,请执行from __future__ import division
,以获得python 3样式划分
它们全部输出:
[[1.5, 2.5, 3.5], [4.5, 5.5, 6.5]]