我正试图让它找到列表中数字的平均值,然后按最高平均值对平均值进行排序。 这就是我所拥有的:
d = defaultdict(list)
for name, score in ListAvg:
d[name].append(score)
print(d.items())
目前正在制作:
dict_items([('J', ['10', '8', '4']), ('D', ['10', '7', '6']),
('I', ['10', '9', '7']), ('G', ['10', '9', '6']),
('C', ['9', '7', '5']), ('B', ['8', '6', '5']),
('F', ['8', '7', '6']), ('E', ['9', '8', '5']),
('A', ['8', '6', '5']), ('H', ['10', '7', '6'])])
理想情况下,我希望它能打印出类似的内容:
dict_items([('I', ['8.66']), ('G', ['8.33'],
('D', ['7.66']),), ('H', ['7.66']),
('J', ['7.33']), ('E', ['7.33']),
('C', ['7']), ('F', ['7']),
('A', ['6.66']), ('B', ['6.33'])])
我是如何才能实现这一目标的,或者至少让它按照该顺序打印出平均值?
答案 0 :(得分:3)
您可以使用statistics.mean使用来获取第二个元素的元组对的平均值和反向排序。
d = dict([('Jordan', ['10', '8', '4']), ('David', ['10', '7', '6']),
('Zak', ['10', '9', '7']), ('Luke', ['10', '9', '6']),
('Chloe', ['9', '7', '5']), ('Charlotte', ['8', '6', '5']),
('Josh', ['8', '7', '6']), ('Dominic', ['9', '8', '5']),
('Matthew', ['8', '6', '5']), ('Harry', ['10', '7', '6'])])
from statistics import mean
from operator import itemgetter
print(sorted(((k,mean(map(int,v))) for k,v in d.items()),key=itemgetter(1),reverse=True))
[('Zak', 8.666666666666666), ('Luke', 8.333333333333334),
('David', 7.666666666666667),('Harry', 7.666666666666667),
('Jordan', 7.333333333333333), ('Dominic', 7.333333333333333),
('Josh', 7.0), ('Chloe', 7.0), ('Charlotte', 6.333333333333333),
('Matthew', 6.333333333333333)]
如果你想要一个dict为排序的元组创建一个OrderedDict
:
from collections import OrderedDict
new_d = OrderedDict(sorted(((k,mean(map(int,v)))
for k,v in d.items()),key=itemgetter(1),reverse=True))
print(new_d)
OrderedDict([('Zak', 8.666666666666666), ('Luke', 8.333333333333334),
('David', 7.666666666666667), ('Harry', 7.666666666666667),
('Dominic', 7.333333333333333), ('Jordan', 7.333333333333333),
('Chloe', 7.0), ('Josh', 7.0), ('Charlotte', 6.333333333333333),
('Matthew', 6.333333333333333)])
OrderedDict
将维护用户从最高到最低平均排序的广告订单。
答案 1 :(得分:2)
使用sum
和len
以及sorted
计算平均值并按其排序:
# the sort function calculates the average for the list
avg = lambda x: sum(int(i) for i in x[1])/len(x[1]))
sorted_by_average = sorted(d.items()), key=avg)
更详细的平均值:
def avg(item):
lst = item[1]
# summarize values as ints
sum_lst = sum(int(x) for x in lst)
return sum_lst / len(lst)