如何用(python)列表中的顺序替换数字

Max*_*tti 2 python arrays sorting algorithm list

我有一个包含整数的列表,并希望替换它们,以便先前包含最高数字的元素现在包含1,第二个最高数字设置为2,等等.

示例: [5, 6, 34, 1, 9, 3]应该屈服[4, 3, 1, 6, 2, 5].

我个人只关心前九个最高的数字我认为可能有一个简单的算法或甚至可能是python函数来处理这个任务?

编辑:我不关心如何处理重复项.

Wil*_*sem 6

一种快速的方法是首先生成元素的元组列表及其位置:

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 result
Run Code Online (Sandbox Code Playgroud)