一种快速的方法是首先生成元素的元组列表及其位置:
sort_data = [(x,i) for i,x in enumerate(data)]
Run Code Online (Sandbox Code Playgroud)
接下来我们将这些元素排序为reverse:
sort_data = sorted(sort_data,reverse=True)
Run Code Online (Sandbox Code Playgroud)
生成(用于您的样本输入):
>>> sort_data
[(34, 2), (9, 4), (6, 1), (5, 0), (3, 5), (1, 3)]
Run Code Online (Sandbox Code Playgroud)
和巢我们需要填写这些元素,如:
result = [0]*len(data)
for i,(_,idx) in enumerate(sort_data,1):
result[idx] = i
Run Code Online (Sandbox Code Playgroud)
或者把它放在一起:
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
Run Code Online (Sandbox Code Playgroud)
这种方法在O(n log n)中有n个元素的数量data.
一个更紧凑的算法(在没有为排序构造元组的意义上)是:
def obtain_rank(data):
sort_data = sorted(range(len(data)),key=lambda i:data[i],reverse=True)
result = [0]*len(data)
for i,idx in enumerate(sort_data,1):
result[idx] = i
return resultRun Code Online (Sandbox Code Playgroud)