一种快速的方法是先生成一个元素及其位置的元组列表:
sort_data = [(x,i) for i,x in enumerate(data)]
接下来,我们将这些元素按照相反的
顺序排序:
sort_data = sorted(sort_data,reverse=True)
生成(对于您的示例输入):
>>> sort_data
[(34, 2), (9, 4), (6, 1), (5, 0), (3, 5), (1, 3)]
接下来,我们需要填写这些元素,例如:
result = [0]*len(data)
for i,(_,idx) in enumerate(sort_data,1):
result[idx] = i
或者把它放在一起:
def obtain_rank(data):
sort_data = [(x,i) for i,x in enumerate(data)]
sort_data = sorted(sort_data,reverse=True)
result = [0]*len(data)
for i,(_,idx) in enumerate(sort_data,1):
result[idx] = i
return result
这种方法在data
元素个数为n时以O(n log n)的时间复杂度运行。
一种更紧凑的算法(意味着不需要为排序构造元组)是:
def obtain_rank(data):
sort_data = sorted(<b>range(len(data)),key=lambda i:data[i]</b>,reverse=True)
result = [0]*len(data)
for i,<b>idx</b> in enumerate(sort_data,1):
result[idx] = i
return result
tmp = sorted(input); output = [0] * len(input); for i in range(min(len(tmp), 9)): output[input.index(tmp[i])] = i
,但我还没有测试过。此外,这段代码对重复项的处理不太好。 - Max Matti