我试图按照每个用户的得分从最高到最低的顺序排序所有得分。我尝试使用以下代码:
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)
。
出了什么问题?
答案 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