我想找到:
不同用户在词典中获得的平均3个不同分数
按字母顺序排列每位用户的最高得分
我工作场所工人的最高分,从最高到最低。
我已经完成了所有代码,但输出错误。
我正在编写的文本文件现已根据实际情况进行了修改:
AdamJohnson:11
AdamJohnson:41
AdamJohnson:15
AdamJohnson:18
AdamJohnson:34
AdamJohnson:48
MichaelJordan:29
MichaelJordan:33
MichaelJordan:46
MichaelJordan:34
DavidSnowman:55
DavidSnowman:35
DavidSnowman:21
DavidSnowman:37
我用来将所有分数写入字典的代码,最后三个分数如下所示:
worker_scores = collections.defaultdict(lambda: collections.deque(maxlen=3))
worker_scores.clear()
with open('score_names.txt') as f:
for line in f:
worker,score = line.split(":")
worker_scores[worker].append(int(score))
for worker in sorted(worker_scores):
print(worker," ".join(map(str,worker_scores[worker])))
上面代码的结果如下所示:
AdamJohnson 18 34 48
DavidSnowman 35 21 37
MichaelJordan 33 46 34
显然,这是我的预期。
现在,显示了我用于按字母顺序排列名称的代码:
def highscores_pupil(worker_scores):
d=OrderedDict()
for k,v in sorted(((i,j.pop()) for i,j in worker_scores.items()),reverse=False):
d[k]=v
for k,v in d.items():
print (':'.join((k,str(v))))
然而,当运行此代码时,最高分是不正确的。而不是:
AdamJohnson:48
DavidSnowman:37
MichaelJordan:46
它显示:
AdamJohnson:48
DavidSnowman:37
MichaelJordan:34
我的第二段代码按照从最高到最低的顺序排列得分:
def highscores_all(worker_scores):
d=OrderedDict()
for k,v in sorted(((i,j.pop()) for i,j in worker_scores.items()),reverse=False):
d[k]=v
for k,v in sorted(d.items(), key=itemgetter(1), reverse=True):
print (':'.join((k,str(v))))
我期望的结果是:
AdamJohnson:48
MichaelJordan:46
DavidSnowman:37
虽然不正确的结果返回为:
AdamJohnson:48
DavidSnowman:37
MichaelJordan:34
最后,为了找到一个平均值,我使用了这行代码:
def average_all(worker_scores):
AvgDictName = dict([(key, float(sum([int(i) for i in values])) / len(values)) for key, values in worker_scores.items()])
for k,v in sorted(AvgDictName.items(), key=itemgetter(1), reverse=True):
print (':'.join((k,str(v))))
实际上确实会产生我需要的结果......
MichaelJordan:37.666666666666664
AdamJohnson:33.333333333333336
DavidSnowman:31.0
为什么每个用户的最高得分和所有工作人员的最高得分(前两个计算)都不正确?
答案 0 :(得分:1)
问题是因为您的分数未排序且pop
只返回最后一个元素,因此您可以在pop
函数中使用max
代替sorted
:< / p>
for k,v in sorted(((i,max(j)) for i,j in worker_scores.items()),reverse=False):
d[k]=v
演示:
>>> max(collections.deque([33 ,46 ,34]))
46