对数字列表进行排名
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])
我有一个列表:
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])