【问题标题】:find rank of user by value按值查找用户排名
【发布时间】:2020-03-02 11:14:29
【问题描述】:

如何按值查找用户的排名。

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 的 Rank 应为 1(因为值相同 196763.8 ),而 playerId 44 的 rank 将为 2

【问题讨论】:

  • 您的列表没有以任何方式排序,即使它没有代码来检查并列分数。此外列表是 0 索引
  • 请尝试排序列表 newlist = sorted(data, key=lambda k: k['value'],reverse=True)
  • 这能回答你的问题吗? How to sort List of dict
  • 分数低的玩家是第一名?
  • 这是一个有趣的问题,不应该被关闭。

标签: python python-3.x pandas


【解决方案1】:

您需要按value 对列表进行排序,并查找是否有一些player_id 与其他@ 具有相同的分数并将它们合并为一个。

这应该可以解决问题:

from collections import defaultdict

new_dict = defaultdict(list)
for x in data:
    new_dict[x['value']].append(x['playerId'])  

rank_list = [[k,v] for k,v in new_dict.items()]
# Set reverse=False if lower score is considered higher rank
rank_list.sort(key=lambda k: k[0], reverse=True) 
def get_rank(player_id):
    for i in range(len(rank_list)):
        if player_id in rank_list[i][1]:

            return i+1 # list is 0 indexed thus +1

print('Rank is %s for player id %s' % (get_rank(44), 44))
> Rank is 1 for player id 44
print('Rank is %s for player id %s' % (get_rank(2), 2))
> Rank is 2 for player id 2
print('Rank is %s for player id %s' % (get_rank(3), 3))
> Rank is 2 for player id 3


【讨论】:

  • 几个 cmets:如果您将项目存储为第一个元素是分数的序列(就像您在此处所做的那样),则不需要 key 参数,默认行为是按第一个项目排序序列,按第二个项目绘制等,但由于您没有绘制,因为您已经合并了它们,因此您设置为没有该参数。另外,我建议使用元组:rank_list = [(k,v) for k,v in new_dict.items()],因为您不需要可变性。
  • 更进一步,rank_list = sorted(new_dict.items(), reverse=True) 应该做到这一点,而不是使用列表推导然后排序,这样会更节省内存。
【解决方案2】:

你可以使用pandas,即:

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)

   playerId     value  rank
0         2  196763.8     1
1         3  196763.8     1
2        44  196764.0     2

Demo

【讨论】:

    猜你喜欢
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多