在我尝试替换python列表时,有人能帮助我处理python列表中的关系吗';他们的队伍是什么?

在我尝试替换python列表时,有人能帮助我处理python列表中的关系吗';他们的队伍是什么?,python,python-3.x,Python,Python 3.x,我有一个类似以下内容的列表: lst_A = [32,12,32,55,12,90,32,75] 我想用它们的等级来代替数字。我正在使用此功能执行以下操作: def obtain_rank(lstC): sort_data = [(x,i) for i,x in enumerate(lstC)] sort_data = sorted(sort_data,reverse=True) result = [0]*len(lstC) for i,(_,idx) in e

我有一个类似以下内容的列表:

lst_A = [32,12,32,55,12,90,32,75]
我想用它们的等级来代替数字。我正在使用此功能执行以下操作:

def obtain_rank(lstC):
    sort_data = [(x,i) for i,x in enumerate(lstC)]
    sort_data = sorted(sort_data,reverse=True)
    result = [0]*len(lstC)
    for i,(_,idx) in enumerate(sort_data,1):
        result[idx] = i
    return result
当我使用此选项时,我得到以下输出:

[6, 8, 5, 3, 7, 1, 4, 2]
但我想从中得到的是:

[4, 7, 5, 3, 8, 1, 6, 2]

我该怎么办呢?

给你。如果您尚未意识到,请阅读以理解
defaultdict
deque

from collections import defaultdict, deque

def obtain_rank(listC):
    sorted_list = sorted(listC, reverse=True)
    
    d = defaultdict(deque)  # deque are efficient at appending/popping elements at both sides of the sequence.
    for i, ele in enumerate(sorted_list):
        d[ele].append(i+1)
    
    result = []
    for ele in listC:
        result.append(d[ele].popleft())  # repeating numbers with lower rank will be the start of the list, therefore popleft
    
    return result

更新:不使用
defaultdict
deque

给你。如果您尚未意识到,请阅读以理解
defaultdict
deque

from collections import defaultdict, deque

def obtain_rank(listC):
    sorted_list = sorted(listC, reverse=True)
    
    d = defaultdict(deque)  # deque are efficient at appending/popping elements at both sides of the sequence.
    for i, ele in enumerate(sorted_list):
        d[ele].append(i+1)
    
    result = []
    for ele in listC:
        result.append(d[ele].popleft())  # repeating numbers with lower rank will be the start of the list, therefore popleft
    
    return result

更新:不使用
defaultdict
deque
试试这个:

import pandas as pd
def obtain_rank(a):
    s = pd.Series(a)
    return [int(x) for x in s.rank(method='first', ascending=False)]
#[4, 7, 5, 3, 8, 1, 6, 2]
试试这个:

import pandas as pd
def obtain_rank(a):
    s = pd.Series(a)
    return [int(x) for x in s.rank(method='first', ascending=False)]
#[4, 7, 5, 3, 8, 1, 6, 2]
您可以使用2个循环:

l = [32,12,32,55,12,90,32,75]

d = list(enumerate(sorted(l, reverse = True), start = 1))

res = []
for i in range(len(l)):
    for j in range(len(d)):
        if d[j][1] == l[i]:
            res.append(d[j][0])
            del d[j]
            break
print(res)

#[4, 7, 5, 3, 8, 1, 6, 2]
您可以使用2个循环:

l = [32,12,32,55,12,90,32,75]

d = list(enumerate(sorted(l, reverse = True), start = 1))

res = []
for i in range(len(l)):
    for j in range(len(d)):
        if d[j][1] == l[i]:
            res.append(d[j][0])
            del d[j]
            break
print(res)

#[4, 7, 5, 3, 8, 1, 6, 2]

什么是
listC
?它可以是任何列表,我正在那里定义一个函数。在这种情况下,在调用此函数时,您可以用lst_A替换lstC。什么是
listC
?它可以是任何列表,我在那里定义一个函数。在这种情况下,在调用此函数时,您可以用lst_A替换lstC。这很酷,但我不允许将任何内容导入到我的文件中!这两个函数是Python内置的。它们不是外部包。我添加了不使用任何导入的解决方案。逻辑上,两个代码段的操作方式相同。您可以用
d[ele]=d.get(ele,[])+[i+1]
替换条件来检查键是否存在。这很酷,但我不允许将任何内容导入到我的文件中!这两个函数是Python内置的。它们不是外部包。我添加了不使用任何导入的解决方案。逻辑上,两个代码段的操作方式相同。您可以用
d[ele]=d.get(ele,[])+[i+1]