Python DefaultDict订购多个值问题

时间:2015-02-22 09:16:58

标签: python python-3.x dictionary sorted defaultdict

我试图按照每个用户的得分从最高到最低的顺序排序所有得分。我尝试使用以下代码:

import collections 
from collections import defaultdict
from operator import itemgetter

worker_scores = collections.defaultdict(lambda: collections.deque(maxlen=3))
import operator

worker_scores.clear() 

with open('score_names.txt') as f:
     for line in f: 
        worker,score = line.split(":")
        worker_scores[worker].append(int(score)) 

print("\nThis prints all the highest scores.\n")

for worker in sorted(worker_scores, key=itemgetter(1,2,3), reverse=True):
   print(worker," ".join(map(str,worker_scores[worker])))

   # This should print the maximum value for each key
   print max(worker_scores, key=worker_scores.get)

我的文本文件也显示如下:

AdamJohnson:10
AdamJohnson:20
AdamJohnson:30
AdamJohnson:40
AdamJohnson:60
AdamJohnson:50 
MichaelJordan:70
MichaelJordan:80
MichaelJordan:100
MichaelJordan:90
DavidSnowman:15
DavidSnowman:20
DavidSnowman:30
DavidSnowman:25

IDLE的结果如下:

This prints all the highest scores.

MichaelJordan 80 100 90
AdamJohnson 40 60 50
DavidSnowman 20 30 25

这就是我想要的,其中最高分数位于顶部,最低分数位于底部。我发现了itemgetter这样做的技术,所以我现在已经完成了部分解决方案。

对于第二部分,我希望打印每个值的最大键。我可以使用排序键按字母顺序打印键,但我无法打印每个键的最大值。我从上面使用过这一行:

print max(worker_scores, key=worker_scores.get)

要获得此结果:

AdamJohnson:60
MichaelJordan:100
DavidSnowman:30

但是这个错误到了:Invalid Syntax (Max)。 出了什么问题?

2 个答案:

答案 0 :(得分:1)

另外,如果我想按照最高结果到最低结果的顺序打印我的字典,我需要使用itemgetter(1),因为我正在查看第二个值,它具有最高分,然后使用reverse属性设置为True,以指示字典必须打印在顶部最高,最低到底部。

如果您不明白,请参阅Sort a Python dictionary by value。我刚刚找到了这个答案。

再次感谢@KasraAD和@AnttiHaapala,以及@ PM2ring的支持,以及对@jonrsharpe的道歉。我现在已成功回答了我自己的问题!

这是代码:

for k,v in sorted(d.items(), key=itemgetter(1), reverse=True):
    print (':'.join((k,str(v))))

答案 1 :(得分:0)

您无需使用max,可以使用sorted功能和collections.OrderedDict

d=OrderedDict()

for k,v in sorted(((i,j.pop()) for i,j in worker_scores.items()),key=operator.itemgetter(1),reverse=True):
    d[k]=v

print d
OrderedDict([('MichaelJordan', 100), ('DavidSnowman', 30), ('AdamJohnson', 60)])

我在前面的代码中完成的所有内容都循环遍历worker_scores项并弹出deque中的最后一个(最大)元素,(j.pop()),但请注意您需要使用reverse=True要获得所需订单,然后将其添加到OrderedDict

用于打印物品:

for k,v in d.items():
    print ':'.join((k,str(v)))

MichaelJordan:100
DavidSnowman:30
AdamJohnson:60