【问题标题】:Python DefaultDict Ordering Multiple Values IssuePython DefaultDict 排序多个值问题
【发布时间】:2015-02-22 09:16:58
【问题描述】:

我正在尝试按照每个用户的分数从高到低的顺序排列所有分数。我用下面的代码尝试了这个:

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)。 出了什么问题?

【问题讨论】:

  • @jonrsharpe 看,先生,我纯粹是为了自己的利益而编写此代码。什么表明我这样做是为了获得任何资格???我很抱歉,但我感到被冒犯了。我一直在查看其他人在 SO 上的项目,以帮助以自己的理解开发自己的程序。请不要暗示我抄袭自己的作品,因为这会破坏我自己的意图。
  • @jonrsharpe 我没有注册 GCSE 资格,因为我已经在上大学了。然后我将删除这个问题并提出一个新问题。为我的爆发道歉,因为你也道歉了,我会把你的 cmets 带上船。谢谢。
  • @DelbertJ.Nava 您在这里只需要使用 sorted 函数对您的字典项目进行排序,然后添加到 OrderedDict,关于提出此类问题,我看到很多人拥有超过100K回答了这样的问题,还有作业问题和......!我觉得这个问题问题不大!!
  • @DelbertJ.Nava 无需删除您的问题,您只需要编辑它并向我们展示您尝试解决问题的方法!;)
  • @DelbertJ.Nava :请不要删除您所有的旧问题!我们有很多人在 Stack Overflow 上询问有关这些 GCSE 任务的问题,所以你不能怪我们有点怀疑,尤其是当我们看到来自同一个人的多个关于这些任务的问题时。我建议,如果您想进一步询问与此任务相关的问题,请在问题中明确说明您知道这是一项 GCSE 任务,但您这样做是为了自学,而不是 GCSE。跨度>

标签: python python-3.x dictionary sorted defaultdict


【解决方案1】:

另外,如果我想按从最高到最低的顺序打印我的字典,我需要使用itemgetter(1),因为我正在查看第二个值,它具有最高的分数,然后使用 reverse 属性设置为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))))

【讨论】:

  • 加上你值得称赞的尝试!
  • @KasraAD 我可以感谢您帮助我完成该计划。我刚刚完成了!非常感谢!
  • @KasraAD 整整两个星期,我终于到了!呜呜!!
  • 真的吗? 2个月?你应该早点问你的问题!
  • @KasraAD 哎呀我的意思是两周哈哈哈
【解决方案2】:

你不需要使用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

【讨论】:

  • 谢谢!我尝试使用以下命令在我的 IDLE 上将您的字典打印为 MichaelJordan:100AdamJohnson:60DavidSnowman:30for worker in sorted(d): print(worker," ".join(map(str,d[worker]))),但这会到达:TypeError: 'int' object is not iterable。我该如何解决这个问题以打印上面想要的结果?
  • 非常感谢先生! @KasraAD 对于我在代码中造成的任何不便,我深表歉意。我可能需要再次询问 SO,但请理解我没有输入任何资格,并且我真诚地怀疑任何孩子都能够使用包括 defaultdict 和数组在内的复杂方法来完成他们在此类资格级别的作业。谢谢:)
  • @DelbertJ.Nava 不客气!没关系这样的问题总是发生在新人身上,还有我自己! ;)
  • 是的,我很抱歉,但不幸的是,由于第一批 cmet 涉及抄袭和作弊,我现在几乎无法发帖。再次感谢您的帮助!我以后可能需要你的帮助! :(
  • 我很惊讶你的评论被 1 否决了,但我认为 SO 不喜欢这篇文章。
猜你喜欢
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
相关资源
最近更新 更多