我有一个数组
array = [('item1',90),('item2',76),('item3',83),('item4',90)]
我希望将其排名为
ranking = [(0,'item1'),(0,'item4'),(2,'item3'),(3,'item2')] // (1)
到目前为止,我使用ranking:
完成了这项工作from ranking import *
>>> array.sort(key=lambda x: x[1],reverse = True)
>>> print [i for i in list(Ranking([i[1] for i in array]))]
这就是我得到的:
[(0, 90), (0, 90), (2, 83), (3, 76)] // (2)
任何人都可以帮我从(2)到(1)吗?我真的不需要使用ranking
。我接受任何其他解决方案。
答案 0 :(得分:2)
array = [('item1',90),('item2',76),('item3',83),('item4',90)]
srt = sorted(array,key=lambda x: x[1], reverse=True)
rankings = []
rank = 0
from itertools import groupby
for k,v in groupby(srt,lambda x: x[1]): # group by score
grp = [(rank,tup[0]) for tup in v] # get item tup[0] and put it in a tuple with the rank
rankings += grp
rank += len(grp) # increase rank for next grouping
print(rankings)
[(0, 'item1'), (0, 'item4'), (2, 'item3'), (3, 'item2')]
答案 1 :(得分:1)
array = [('item1',90),('item2',76),('item3',83),('item4',90)]
def s(t):
return t[1]
array.sort(reverse = True, key = s)
def rank(array):
res = []
for index, tup in enumerate(array):
if index == 0:
res.append(tuple([ index, tup[0]]))
elif tup[1] == array[index -1][1]:
res.append(tuple([index -1, tup[0]]))
else:
res.append(tuple([index , tup[0]]))
return res
r = rank(array)
print r
输出 - [(0,'item1'),(0,'item4'),(2,'item3'),(3,'item2')]
这可能是非常长的解决方案,但我希望这可以正常工作
答案 2 :(得分:1)
您可以使用Pandas DataFrame执行此操作。我推荐这个解决方案,因为它的语义设计非常适合您希望的目的:
import pandas as pd
df = pd.DataFrame.from_records([('item1',90),('item2',76),
('item3',83),('item4',90)])
在我们操作它之前,这是原始数据框架:
>>> df
0 1
0 item1 90
1 item2 76
2 item3 83
3 item4 90
现在我们将选择第1列并将其降序排列,并将排名添加回数据框(使用min方法):
>>> df['rank'] = df[1].rank(method='min', ascending=False)
>>> df
0 1 rank
0 item1 90 1
1 item2 76 4
2 item3 83 3
3 item4 90 1
现在我们将所需的列转换回元组列表,不包括索引:
>>> l = list(df[[0, 'rank']].to_records(index=False))
>>> l
[('item1', 1.0), ('item2', 4.0), ('item3', 3.0), ('item4', 1.0)]
我们可以通过列表理解将其置于所需状态:
>>> l2 = [(i, int(j-1)) for i, j in l]
>>> l2
[('item1', 0), ('item2', 3), ('item3', 2), ('item4', 0)]
答案 3 :(得分:0)
我没有安装排名,因此无法对其进行测试,但documentation表示Ranking()支持传递密钥功能,以便从列表中选择值。
我建议尝试这样的事情:
print Ranking(array, key=lambda x: x[1], reverse=True)
答案 4 :(得分:0)
array = [('item1',90),('item2',76),('item3',83),('item4',90)]
values = sorted(v for k, v in array)
d = dict(zip(values, range(len(values)-1, -1, -1)))
print sorted(( (d[i],item) for (item, i) in array ))
这会产生输出:
[(0, 'item1'), (0, 'item4'), (2, 'item3'), (3, 'item2')]
values
包含值的排序列表:
[76, 83, 90, 90]
然后我们创建一个字典d
来对它们进行排序。 d
是:
{76: 3, 83: 2, 90: 0}