从给定的元组列表中找到maxaverage

时间:2017-09-17 10:47:16

标签: python python-3.x

编写一个Python函数maxaverage(l),它将形式(名称,分数)对的列表作为参数,其中name是一个字符串,score是一个整数。每对都将被解释为指定玩家的得分。例如,形式[('Kohli',73),('Ashwin',33),('Kohli',7),('Pujara',122),('Ashwin',90)]的输入表示Kohli得分为73分和7分,Ashwin得分为33分和90分,Pujara得分为122分。您的函数应该计算平均得分最高的玩家(平均值=该玩家所有得分的总数除以条目数)并将这些玩家的名字列表作为列表返回,按字母顺序排序。如果只有一个玩家,该列表将包含一个名称。

例如,maxaverage([('Kohli',73),('Ashwin',33),('Kohli',7),('Pujara',122),('Ashwin',90)])应返回['Pujara']因为Kolhi的平均得分为40(80除以2),Ashwin的平均得分为61.5(123除以2),而Pujara的平均得分为122(122除以1),其中122是最高的。

同样的解决方案应该是['Kohli', 'Ashwin']如果l = ([('Kohli',73),('Ashwin',33),('Kohli',7),('Pujara'‌​,22),('Ashwin',47)]),但我只得到kohli

from collections import defaultdict

def maxaverage(l):
    dl = []
    data_dict = defaultdict(list)
    for k, v in l:
        data_dict[k].append(v)
    data_dict = dict(data_dict)

    for k, v in data_dict.items():
        data_dict[k] = sum(v) / len(v)

    list(zip(data_dict.keys(), data_dict.values()))
    max(data_dict.values())
    x = (max(data_dict, key=data_dict.get))
    dl.append(x)
    return dl

3 个答案:

答案 0 :(得分:0)

试试这些代码:

l = [('Kohli', 73), ('Ashwin', 33), ('Kohli', 7), ('Pujara', 22), ('Ashwin', 47)]


def max_average(l):
    from operator import itemgetter
    from itertools import groupby
    lst_of_pairs = list()

    for key, group in groupby(sorted(l, key=itemgetter(0)), key=itemgetter(0)):
        scores = list(x[1] for x in group)
        avg = sum(scores) / len(scores)
        lst_of_pairs.append((key, avg))

        lst_of_pairs.sort(key=itemgetter(1), reverse=True)
    max_avg = lst_of_pairs[0][1]
    return list(e[0] for e in filter(lambda x: x[1] == max_avg, lst_of_pairs))


print(max_average(l))

对于'l'的情况,你可以按照预期得到['Ashwin','Kohli']。请记住,groupby只能在排序列表上工作。

答案 1 :(得分:0)

只需在方法的末尾添加一个列表推导,以获得基于最大平均值的dict键,即

from collections import defaultdict

def maxaverage(l):
    data_dict = defaultdict(list)

    for k, v in l:
        data_dict[k].append(v)

    data_dict = dict(data_dict)

    for k, v in data_dict.items():
        data_dict[k] = sum(v) / len(v)

    dl = [i for i,j in data_dict.items() if j == max(data_dict.values())]
    return dl 

输出:

maxaverage([('Kohli', 73), ('Ashwin', 33), ('Kohli', 7), ('Pujara', 22), ('Ashwin', 47)])
#['Ashwin', 'Kohli']

maxaverage(([('Kohli',73),('Ashwin',33),('Kohli',7),('Pujara',122),('Ashwin',90)]) 
#['Pujara']

答案 2 :(得分:0)

以下是代码的更正版本,可确保最终结果按字母顺序排序。它还有一些效率提升:

from collections import defaultdict

def maxaverage(l):
    data_dict = defaultdict(list)
    for k, v in l:
        data_dict[k].append(v)

    data_dict = {k: sum(v)/len(v) for k,v in data_dict.items()}

    max_avg = max(data_dict.values())
    return sorted([k for k in data_dict if data_dict[k] == max_avg])


>>> maxaverage(([('Kohli',73),('Ashwin',33),('Kohli',7),('Pujara',122),('Ashwin',90)]))
['Pujara']

>>> maxaverage([('Kohli', 73), ('Ashwin', 33), ('Kohli', 7), ('Pujara', 22), ('Ashwin', 47)])
['Ashwin', 'Kohli']

请注意,第二个测试用例中的解决方案应该是['Ashwin', 'Kohli'],而不是['Kohli', 'Ashwin'](如您的问题中所述),因为最终列表应该排序。