编辑-我已经看到了其他问题的答案,解释了如何按键或值对字典进行排序,但没有看到任何允许访问键和值的答案。如果我做错了什么,我很抱歉,我显然是新来的。有人删除了我帖子末尾的致谢词,这对我来说似乎很奇怪,但如果我不应该在帖子中这样做,如果有人让我知道那就太好了
我正在开发一个个人项目,能够将梦幻棒球联盟的评分设置输入到程序中,并接收球员列表以及他们在特定评分系统下的总得分。我做了一些工作,读取包含不同评分类别的总计的文件,并根据用户输入的设置计算总分。然后,我将信息添加到字典中,其中玩家姓名、球队和位置的字符串是键,他们的总得分是值。这是字典中的前几个条目:
{'Rick Porcello, Bos SP': 579.0, 'Chris Sale, CWS SP': 575.0, 'Justin Verlander, Det SP': 601.0, 'Madison Bumgarner, SF SP': 617.0, 'Max Scherzer, Wsh SP': 668.0, 'Johnny Cueto, SF SP': 584.0}
我现在正在寻找一种方法来显示按总分从最大到最小排序的字典内容。例如,我想将上述条目显示为:
'Max Scherzer, Wsh SP': 668.0
'Madison Bumgarner, SF SP': 617.0
'Justin Verlander, Det SP': 601.0
'Johnny Cueto, SF SP': 584.0
'Rick Porcello, Bos SP': 579.0
'Chris Sale, CWS SP': 575.0
我知道字典的排序功能,但这只给我留下了总分列表。有没有一种方法可以让我根据值对条目进行排序,但仍然能够访问 key ,以便我知道哪个玩家获得了 X 分?
此外,如果有一个函数可以让我做我想做的事情,那么该函数如何扩展?我假设一个函数即使复杂性很差,只需要几个条目就可以了,但我的完整字典将有数百个玩家。这只是一个个人项目,所以如果我需要等一分钟才能得到结果,那没什么大不了的,但显然越快越好。我只是对这一部分感到好奇,因为无论整体速度如何,都能做到这一点是我主要关心的问题。
最佳答案
如果您想使用键/值结构保留排序结果,我建议 collections.OrderedDict
:
from collections import OrderedDict
from operator import itemgetter
dct = {'Rick Porcello, Bos SP': 579.0, 'Chris Sale, CWS SP': 575.0, 'Justin Verlander, Det SP': 601.0, 'Madison Bumgarner, SF SP': 617.0, 'Max Scherzer, Wsh SP': 668.0, 'Johnny Cueto, SF SP': 584.0}
OrderedDict(sorted(dct.items(), key=itemgetter(1), reverse=True))
key=itemgetter(1)
定义您按“值”排序,reverse=True
告诉 sorted
按降序排序。
这给出:
OrderedDict([('Max Scherzer, Wsh SP', 668.0),
('Madison Bumgarner, SF SP', 617.0),
('Justin Verlander, Det SP', 601.0),
('Johnny Cueto, SF SP', 584.0),
('Rick Porcello, Bos SP', 579.0),
('Chris Sale, CWS SP', 575.0)])
并且仍然可以像普通字典一样访问:
>>> odict['Chris Sale, CWS SP']
575.0
或迭代它:
>>> for name, value in odict.items():
... print('{name}: {value}'.format(name=name, value=value))
Max Scherzer, Wsh SP: 668.0
Madison Bumgarner, SF SP: 617.0
Justin Verlander, Det SP: 601.0
Johnny Cueto, SF SP: 584.0
Rick Porcello, Bos SP: 579.0
Chris Sale, CWS SP: 575.0
鉴于它对输入进行排序,它将以 O(n logn)
进行缩放。
关于python - 按值对字典进行排序而不丢失键的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41202256/