在我尝试替换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]