Python 按值查找用户的排名

Python 按值查找用户的排名,python,python-3.x,pandas,Python,Python 3.x,Pandas,如何通过值查找用户的排名 data = [ { "playerId": 2, "value": 196763.8 }, { "playerId": 3, "value": 196763.8 }, { "playerId": 44, "value": 196764 }

如何通过值查找用户的排名

data = [
        {
            "playerId": 2,
            "value": 196763.8
        },
        {
           "playerId": 3,
           "value": 196763.8
        },
        {
           "playerId": 44,
           "value": 196764
        }
]
我试过:

index = [ x['playerId'] for x in data ].index(3) #3 playerId
rank = index+1
我得到的排名是:2


playerId 2和3的排名应为1(因为值相同,为196763.8),playerId 44的排名应为2

您需要根据
值对列表进行排序,并找出一些
玩家id
是否与其他玩家的得分相同,然后将它们合并为一个

这应该可以做到:

从集合导入defaultdict
新建目录=默认目录(列表)
对于数据中的x:
新的dict[x['value']]。追加(x['playerId'])
rank_list=[[k,v]表示新目录项()中的k,v]
#如果较低的分数被视为较高的等级,则设置反向=False
rank_list.sort(key=lambda k:k[0],reverse=True)
def获得等级(玩家id):
对于范围内的i(len(排名列表)):
如果排名列表[i][1]中的玩家id:
返回i+1#列表的索引为0,因此为+1
打印('对于玩家id%s%%,排名为%s(获取排名(44),44))
>对于id为44的玩家,等级为1
打印('对于玩家id%s%%,排名为%s(获取排名(2),2))
>玩家id 2的等级为2
打印('对于玩家id%s%%,排名为%s(获取排名(3),3))
>玩家id为3的等级为2

您可以使用熊猫,即:

df = pd.DataFrame(data)
df['rank'] = df['value'].rank(ascending=True, method="min").astype(int)
df = df.sort_values(by=['rank']).reset_index(drop=True)
for i in range(1, len(df)):
    last, curr = df.loc[i-1, 'rank'], df.loc[i, 'rank']
    df.loc[i, 'rank'] = last + 1 if last < curr else last

print(df)

您的列表不会以任何方式排序,即使是这样,也没有代码检查并列分数。此外,列表为0索引请尝试对列表进行排序newlist=sorted(data,key=lambda k:k['value'],reverse=True)这是否回答了您的问题?分数较低的玩家是第一名?这是一个有趣的问题,不应该被关闭。两条注释:如果您将项目存储为第一个元素为分数的序列,则不需要关键参数(如您在此处所做的),默认行为是按序列中的第一个项目排序,按第二个项目绘制,等等,但由于您没有图形,因为您已经合并了它们,所以设置时没有该参数。另外,我建议使用一个元组:
rank\u list=[(k,v)for k,v in new\u dict.items()]
,因为您不需要可变性。更进一步的是,
rank\u list=sorted(new\u dict.items(),reverse=True)
应该可以做到这一点,而不是使用列表理解然后排序,这样会更节省内存。
   playerId     value  rank
0         2  196763.8     1
1         3  196763.8     1
2        44  196764.0     2