python-3.x - python 如何对数字列表进行排名并打印出排名?

64 2

我有一个,我想要排名的数字列表,从1(最高)开始,然后打印出来。 对于相关的数字, 我只想按顺序对它们进行编号, 以先到者为准 。


lst = [[0.0], [0.0], [0.0], [0.1], [0.2]]



#expected output


rank_lst = [3,4,5,2,1]



我只是想要一个简单的功能,类似于我所做的:

rank_lst = [sorted(lst).index(values) for values in lst]

然而,这一个从0开始,将最低的数字排在0,并用相同的数字对并列值进行排序,如下所示,


#output


rank_list = [0,0,0,1,2]



时间:

77 0

下面是一个有效的代码:


first = [[0.0], [0.0], [0.0], [0.1], [0.2]]



indices = list(range(len(first)))


# print (indices) - Find indices of elements in list - [0, 1, 2, 3, 4]



indices.sort(key=lambda x: first[x], reverse=True)



rank_1st = [0] * len(indices) # Creates empty list of indices



for i, value in enumerate(indices):


 rank_1st[value] = i + 1 # Since (question says that) rank/index has to start from 1 not 0.



print(rank_1st)



输出:


[3, 4, 5, 2, 1]



indices.sort(key=lambda x: first[x], reverse=True)

  • 我们根据指定索引处的元素对索引进行排序。 在你的例子中我们得到 [4, 3, 0, 1, 2] ,即列表的第5个元素(0.2)是最高的,所以,它的索引是4,它被移动到列表的开头。 因此在索引 4 - 元素为 0.2 。 关系按顺序排列/索引以先到者为准( 0, 1, 2 )

for i, value in enumerate(indices): rank_1st[value] = i + 1

  • 我们替换索引( 在创建一个空的索引列表之后) [0, 0, 0, 0, 0] )具有从最高到最低值( 0 -4 ) 最高为 0 换句话说,因为 0.2 在索引 4我们希望它具有 0 ( 非 4 )的等级/索引,然后第二高值( 0.1 ) 具有 1 ( 非 3 )的等级/索引和等等 。

  • 由于你的问题的排名从1开始,我们不希望我们的最高值的索引为0,我们希望它为1。 因此,我们将 i的值增加 1 ( 因此 0成为 1,1变成等等) 。 因此,i + 1 将从 [2, 3, 4, 1, 0][3, 4, 5, 2, 1]

希望有帮助!

133 4

你可以这样做


lst = [[0.0], [0.0], [0.0], [0.1], [0.2]]


# wanted: rank_lst == [3, 4, 5, 2, 1]



# add original position


data = list(enumerate(lst, start=1))


# -> [(1, [0.0]), (2, [0.0]), (3, [0.0]), (4, [0.1]), (5, [0.2])]



# sort by value


data = list(sorted(data, key=lambda x: x[1], reverse=True))


# -> [(5, [0.2]), (4, [0.1]), (1, [0.0]), (2, [0.0]), (3, [0.0])]



# add sorted position


data = list(enumerate(data, start=1))


# -> [(1, (5, [0.2])), (2, (4, [0.1])), (3, (1, [0.0])), (4, (2, [0.0])), (5, (3, [0.0]))]



# resort to original order


data = list(sorted(data, key=lambda x: x[1][0]))


# -> [(3, (1, [0.0])), (4, (2, [0.0])), (5, (3, [0.0])), (2, (4, [0.1])), (1, (5, [0.2]))]



# extract sorted order number


rank_lst = [x[0] for x in data]


# -> [3, 4, 5, 2, 1]



当然,你可以放弃所有对 list的调用。 我只用那些来创建输出。

原作者:
...