【发布时间】:2015-02-22 14:23:12
【问题描述】:
我正在寻找:
不同用户在字典中获得的 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
为什么每个用户的最高分和所有工人的最高分(前两次计算)都不正确?
【问题讨论】:
-
看看
[(i,j.pop()) for i,j in worker_scores.items()]。您的代码没有理由产生最高分。 -
这可能是巧合,但是.. 意外的结果似乎是
for worker in sorted(worker_scores): ..给出的结果的最后一个元素。此外,像你提到的那些 cmets 会被标记和删除,我的猜测是持续发布它们的用户最终将面临他的行为的后果。
标签: python arrays sorting dictionary