我有一个清单:
somelist = [500, 600, 200, 1000]
我想生成该列表的排名顺序:
rankorderofsomelist = [3, 2, 4, 1]
有some complex solutions,但有没有人有任何简单的方法?
答案 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]