【问题标题】:Dictionary output incorrect after sorting排序后字典输出不正确
【发布时间】: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


【解决方案1】:

问题是因为您的分数没有排序,pop 只返回最后一个元素,因此您可以在 sorted 函数中使用 max 而不是 pop

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

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多