编写一个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
答案 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']
(如您的问题中所述),因为最终列表应该排序。