对数字列表进行排名

Ranking a List of Numbers

我有一个列表:

 somelist = [500, 600, 200, 1000]

我想生成该列表的排名顺序:

 rankorderofsomelist = [3, 2, 4, 1]

some complex solutions,但是有谁有简单的方法吗?

我能想到的最简单的:

rankorder = sorted(range(len(thelist)), key=thelist.__getitem__)

这当然会产生 [2, 1, 3, 0],因为 Python 索引总是从零开始的——如果出于某种绝对奇怪的原因您需要为每个索引加一,您当然可以轻松做到:

rankorder_weird = [1+x for x in rankorder]

试试这个单线:

rankorderofsomelist = [sorted(somelist).index(x) for x in somelist]

请注意,对于具有相同值的多个条目的列表,它的行为与预期一致(例如,具有相同值的四个实例,它们都是列表中的第二大实例,都将排在第 2 位)。另请注意,Pythonic 排序是升序的(从最小到最大)并且从零开始,因此您可能必须对列表进行最后一次传递以增加排名、反转排名等。

您可以将该传球包含在单程中。要产生您想要的结果,只需使用:

rankorderofsomelist = [len(somelist)-(sorted(somelist).index(x)) for x in somelist]

既然你已经标记了这个问题 scipy,你可以使用 scipy.stats.rankdata:

>>> rankdata(somelist)
array([ 2.,  3.,  1.,  4.])
>>> len(somelist) - rankdata(somelist)
array([ 2.,  1.,  3.,  0.])
>>> len(somelist) - rankdata(somelist) + 1
array([ 3.,  2.,  4.,  1.])

真正的优势是您可以指定如何处理极端情况:

>>> rankdata([0,1,1,2])
array([ 1. ,  2.5,  2.5,  4. ])
>>> rankdata([0,1,1,2], method='min')
array([ 1,  2,  2,  4])
>>> rankdata([0,1,1,2], method='dense')
array([ 1,  2,  2,  3])