Python,排序列表

时间:2015-10-19 20:25:45

标签: python orange

我正试图让它找到列表中数字的平均值,然后按最高平均值对平均值进行排序。 这就是我所拥有的:

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'])])

我是如何才能实现这一目标的,或者至少让它按照该顺序打印出平均值?

2 个答案:

答案 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)

使用sumlen以及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)