排名数字列表

时间:2015-03-02 00:16:42

标签: python python-2.7 scipy

我有一个清单:

 somelist = [500, 600, 200, 1000]

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

 rankorderofsomelist = [3, 2, 4, 1]

some complex solutions,但有没有人有任何简单的方法?

3 个答案:

答案 0 :(得分:4)

最简单的我能想到:

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

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

rankorder_weird = [1+x for x in rankorder]

答案 1 :(得分:3)

由于您已对此问题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.])

答案 2 :(得分:2)

试试这个单行:

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

请注意,对于具有相同值的多个条目的列表(例如,相同值的四个实例,它们都是列表中的第二大实例,将全部排名为2),它将按预期运行。另请注意,Pythonic排序是升序(从最小到最大)和从零开始,因此您可能必须在列表上应用最终传递以增加排名,反转它们等。

你可以在单线中加入传球。要产生您想要的结果,只需使用:

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