Python, 排序列表

Python, Sort List

我正在尝试获取它,以便它找到列表中数字的平均值,然后按最高平均值对平均值进行排序。 这是我目前所拥有的:

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

有什么办法可以做到这一点,或者至少让它按那个顺序打印名字和平均值?

使用sumlensorted计算平均值并按它排序:

# 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)

您可以使用 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)]

如果你想要一个字典,为排序的元组创建一个 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 将维护用户从平均数从最高到最低排序的插入顺序。