Search code examples
pythonranking

Rank an array of tuples


I have an array

array = [('item1',90),('item2',76),('item3',83),('item4',90)]

and I'd like to rank it like

ranking = [(0,'item1'),(0,'item4'),(2,'item3'),(3,'item2')] // (1)

This is what I've done it so far, using ranking:

from ranking import *

>>> array.sort(key=lambda x: x[1],reverse = True)
>>> print [i for i in list(Ranking([i[1] for i in array]))]

This is what I get:

[(0, 90), (0, 90), (2, 83), (3, 76)] // (2)

Can anyone help me to get from (2) to (1)? I don't really need to use ranking. I accept any other solution.


Solution

  • array = [('item1',90),('item2',76),('item3',83),('item4',90)]
    srt = sorted(array,key=lambda x: x[1], reverse=True)
    rankings = []
    rank = 0
    from itertools import groupby
    for k,v in groupby(srt,lambda x: x[1]): # group by score
        grp = [(rank,tup[0]) for tup in v] # get item tup[0] and put it in a tuple with the rank
        rankings += grp
        rank += len(grp) # increase rank for next grouping
    print(rankings)
    [(0, 'item1'), (0, 'item4'), (2, 'item3'), (3, 'item2')]