Python &引用;分组方式;具有字典理解的聚合函数
我有一系列的配对(名字、分数)和重复出现的名字。我想得到每个名字的最高分数。对于最终结果,名称标签本身是可选的。这是一个工作实现:Python &引用;分组方式;具有字典理解的聚合函数,python,list-comprehension,Python,List Comprehension,我有一系列的配对(名字、分数)和重复出现的名字。我想得到每个名字的最高分数。对于最终结果,名称标签本身是可选的。这是一个工作实现: from collections import defaultdict scores = (('eyal', 76), ('alex', 50), ('oded', 90), ('eyal', 100), ('alex', 99)) distinct = defaultdict(set) for score in scores: distinct[score
from collections import defaultdict
scores = (('eyal', 76), ('alex', 50), ('oded', 90), ('eyal', 100), ('alex', 99))
distinct = defaultdict(set)
for score in scores:
distinct[score[0]].add(score[1])
max_scores = [max(distinct[k]) for k in distinct]
print (max_scores)
我想知道,这可以通过词典理解一步完成吗
In [22]: dict(sorted(scores))
Out[22]: {'alex': 99, 'eyal': 100, 'oded': 90}
这是基于这样的观察:一旦我们对元组进行排序,我们只想为每个名称保留最后一个元组,dict()
很好地做到了这一点
或者
In [16]: [max(vals) for _,vals in itertools.groupby(sorted(scores), lambda x:x[0])]
Out[16]: [('alex', 99), ('eyal', 100), ('oded', 90)]
这更冗长,但也更一般。例如,它可以很容易地用来计算平均分数,而第一个解决方案却不能。我理解想要减少代码的愿望,但你不可能给其他人带来维护噩梦吗?
dict(排序(分数))
应该在一行中完成这项任务。[该死的我跑得快;)]dict(排序(分数))
。[哇,4秒太慢了!]我也喜欢groupby
解决方案——它可以更好地扩展到更复杂的问题,尽管乍一看它没有那么流畅。很好。我用timeit测试了性能:op=45.6,groupby=59.6,dict(sorted)=13.5,