Python, Sort List
Question: I'm trying to get it so that it finds the average of the numbers inside the
list, then sorts the averages by highest average. Here's what I have o far:

    
    
    d = defaultdict(list)
    for name, score in ListAvg:
        d[name].append(score)
    print(d.items())
    

This currently prrints:

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

Ideally I want it to print something like:

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

Any way how I can make this happen, or at least have it print the names with
the averages in that order?


Answer: You can use
[statistics.mean](https://docs.python.org/3/library/statistics.html#statistics.mean)
using to get the the average and reverse sort the the tuple pairs by the
second element.

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

If you want a dict create an `OrderedDict` for the sorted tuples:

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

The `OrderedDict` will maintain the insertion order which is users sorted from
highest to lowest average.

