位置排名和处理Python中的关系

Bry*_*oso 3 python django math

(我很抱歉这个问题的先前版本显示了我需要解决的错误功能,这已经得到了补救,我希望这个问题现在更有意义了.)

我有一个有分数的对象列表,我正在尝试根据这些分数为他们分配排名.下面基本上是我输出数据的方式.

sorted_scores = [
    ('Apolo Ohno', 0),
    ('Shanie Davis', -1),
    ('Bodie Miller', -2),
    ('Lindsay Vohn', -3),  
    ('Shawn White', -3),
    ('Bryan Veloso', -4)
]
Run Code Online (Sandbox Code Playgroud)

我有领带.现在,将位置分配给上面的对象的函数现在是一个简单的for循环,只是将值指定i为对象的最终位置.

positions = {}

i = 1
for key, value in sorted_list:
    # Since in my codebase the strings are IDs, I use the key to fetch the object.
    if value is not None:
        positions[key] = i
        i += 1
Run Code Online (Sandbox Code Playgroud)

所以这显然会回归:

positions = {
    'Apolo Ohno': 1,
    'Shanie Davis': 2,
    'Bodie Miller': 3,
    'Lindsay Vohn': 4,        
    'Shawn White': 5,
    'Bryan Veloso': 6
}
Run Code Online (Sandbox Code Playgroud)

希望这是有道理的.问题的关键在于循环.更有意义的是它是否会像这样返回它们:

positions = {
    'Apolo Ohno': 1,
    'Shanie Davis': 2,
    'Bodie Miller': 3,
    'Lindsay Vohn': 4, # Same value.
    'Shawn White': 4, # Same value.
    'Bryan Veloso': 6
}
Run Code Online (Sandbox Code Playgroud)

我如何编辑上面的函数来做到这一点,记住我可以在任何给定的时间有任何数量的关系取决于我的成员排名所述对象的数量?最高等级应为1,因此可以显示为:<rank>/<total # of people>

提前致谢.:)

Joh*_*ooy 7

>>> sorted_scores = [
...     ('Apolo Ohno', 0),
...     ('Shanie Davis', -1),
...     ('Bodie Miller', -2),
...     ('Lindsay Vohn', -3),  
...     ('Shawn White', -3),
...     ('Bryan Veloso',-4)
... ]
>>> 
>>> res = {}
>>> prev = None
>>> for i,(k,v) in enumerate(sorted_scores):
...     if v!=prev:
...         place,prev = i+1,v
...     res[k] = place
... 
>>> print res
{'Apolo Ohno': 1, 'Bryan Veloso': 6, 'Shanie Davis': 2, 'Lindsay Vohn': 4, 'Bodie Miller': 3, 'Shawn White': 4}
Run Code Online (Sandbox Code Playgroud)

请记住,dicts是无序的,因此要按地点顺序迭代,您需要这样做

>>> from operator import itemgetter
>>> print sorted(res.items(),key=itemgetter(1))
[('Apolo Ohno', 1), ('Shanie Davis', 2), ('Bodie Miller', 3), ('Lindsay Vohn', 4), ('Shawn White', 4), ('Bryan Veloso', 6)]
Run Code Online (Sandbox Code Playgroud)