Python DefaultDict 排序多个值问题
Python DefaultDict Ordering Multiple Values Issue
我正在尝试按照每个用户的分数从最高到最低的顺序对所有分数进行排序。我已尝试使用以下代码:
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)
。
出了什么问题?
你不需要使用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
另外,如果我想按照从最高结果到最低结果的顺序打印我的字典,我需要使用 itemgetter(1)
因为我正在查看第二个值,它具有最高分,然后使用反向 属性 设置为 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))))
我正在尝试按照每个用户的分数从最高到最低的顺序对所有分数进行排序。我已尝试使用以下代码:
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)
。
出了什么问题?
你不需要使用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
另外,如果我想按照从最高结果到最低结果的顺序打印我的字典,我需要使用 itemgetter(1)
因为我正在查看第二个值,它具有最高分,然后使用反向 属性 设置为 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))))