按值排序字典而不会丢失密钥信息

时间:2016-12-17 19:26:35

标签: python sorting dictionary

编辑 - 我已经看到了其他问题的答案,这些问题解释了如何按键或值对字典进行排序,但没有看到任何允许访问键和值的问题。抱歉,如果我做错了什么,我在这里显然很新。有人在我的帖子末尾编辑了感谢,这对我来说很奇怪,但如果我不应该在我的帖子中这样做,那么如果有人会让我知道那就很棒

我正在开展一个个人项目,能够将梦幻棒球联赛的得分设置输入到一个项目中,并接收一个球员名单以及他们在某个得分系统下的总得分。我做了一些工作,阅读包含不同评分类别总计的文件,并根据用户输入的设置计算得分总数。然后我将信息添加到字典中,其中一个玩家的名字,团队和位置的字符串是关键字,他们的点总数是值。这是字典中的前几个条目:

{'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

我知道字典的排序函数,但这只留下了总点数的列表。有没有办法我可以根据值对条目进行排序,但仍然能够访问密钥,以便我知道哪个玩家获得了X分?

此外,如果有一个功能可以让我做我喜欢的事情,那么这个功能如何扩展?我假设一个功能,即使复杂性很差,只需几个条目就可以了,但我的完整字典会有数百个玩家。这只是一个个人项目,所以如果我必须等待一分钟才能得到结果,这不是什么大问题,但显然更快更好。我对此部分感到好奇,因为无论总体速度如何,这都是我的主要关注点。

1 个答案:

答案 0 :(得分:2)

如果您想使用键/值结构保留排序结果,我建议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)一起缩放。