计算第一个数字相似的所有元组值的平均值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算第一个数字相似的所有元组值的平均值相关的知识,希望对你有一定的参考价值。
考虑元组列表
[(7751, 0.9407466053962708), (6631, 0.03942129), (7751, 0.1235432)]
如何以第一个数字相似的pythonic方式计算所有元组值的平均值?例如答案必须是
[(7751, 0.532144902698135), (6631, 0.03942129)]
答案
一种方法是使用collections.defaultdict
from collections import defaultdict
lst = [(7751, 0.9407466053962708), (6631, 0.03942129), (7751, 0.1235432)]
d_dict = defaultdict(list)
for k,v in lst:
d_dict[k].append(v)
[(k,sum(v)/len(v)) for k,v in d_dict.items()]
#[(7751, 0.5321449026981354), (6631, 0.03942129)]
另一答案
你用groupby
,
from itertools import groupby
result = []
for i,g in groupby(sorted(lst),key=lambda x:x[0]):
grp = list(g)
result.append((i,sum(i[1] for i in grp)/len(grp)))
使用,list comprehension
,
def get_avg(g):
grp = list(g)
return sum(i[1] for i in grp)/len(grp)
result = [(i,get_avg(g)) for i,g in groupby(sorted(lst),key=lambda x:x[0])]
结果
[(6631, 0.03942129), (7751, 0.5321449026981354)]
另一答案
来自groupby
的itertools
是你的朋友:
>>> l=[(7751, 0.9407466053962708), (6631, 0.03942129), (7751, 0.1235432)]
>>> #importing libs:
>>> from itertools import groupby
>>> from statistics import mean #(only python >= 3.4)
>>> # mean=lambda l: sum(l) / float(len(l)) #(for python < 3.4) (*1)
>>> #set the key to group and sort and sorting
>>> k=lambda x: x[0]
>>> data = sorted(l, key=k)
>>> #here it is, pythonic way:
>>> [ (k, mean([m[1] for m in g ])) for k, g in groupby(data, k) ]
结果:
[(6631, 0.03942129), (7751, 0.5321449026981354)]
以上是关于计算第一个数字相似的所有元组值的平均值的主要内容,如果未能解决你的问题,请参考以下文章