排序后字典输出不正确

时间:2015-02-22 14:23:12

标签: python arrays sorting dictionary

我想找到:

  • 不同用户在词典中获得的平均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

为什么每个用户的最高得分和所有工作人员的最高得分(前两个计算)都不正确?

1 个答案:

答案 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