【问题标题】:Sorting a JSON file for Discord leaderboards为 Discord 排行榜排序 JSON 文件
【发布时间】:2021-06-21 17:10:33
【问题描述】:

在 StackOverflow 上环顾四周,没有找到任何可以回答我问题的东西。 我试图通过这样做来做到这一点

async def leaderboard(self, ctx):
    leaderboard = {}
    with open("database.json") as f:
        leaderboard = json.load(f)
    f.close()
    sorted_data = {id: money for id, money in sorted(leaderboard.items(), reverse=True ,key=lambda money: money[1])}
    print(sorted_data)

我想为我的 Discord 公会制作排行榜,并且我将每个用户的货币存储在 JSON 文件中。

例如,在 JSON 文件中,它们看起来像:

{
"_default": {

"30": {
    "money": 0,
    "userid": 349846310024642560
},
"32": {
    "money": 30861,
    "userid": 228718166602153985
},
"33": {
    "money": 325663,
    "userid": 180688669089202177
}
}
}

我如何排序并抓住 10 个左右最富有的用户?

【问题讨论】:

    标签: python json dictionary discord.py


    【解决方案1】:

    您可以使用此示例如何按money 键对字典进行排序,然后打印顶部x 用户:

    data = {
        "30": {"money": 0, "userid": 349846310024642560},
        "32": {"money": 30861, "userid": 228718166602153985},
        "33": {"money": 325663, "userid": 180688669089202177},
    }
    
    richest = sorted(data, key=lambda k: -data[k]["money"])
    
    for k in richest[:2]:  # <-- change to 10 if you want top 10
        print(
            "Money: {:<10} UserId: {}".format(data[k]["money"], data[k]["userid"])
        )
    

    打印:

    Money: 325663     UserId: 180688669089202177
    Money: 30861      UserId: 228718166602153985
    

    编辑:使用_default 键:

    data = {
        "_default": {
            "30": {"money": 0, "userid": 349846310024642560},
            "32": {"money": 30861, "userid": 228718166602153985},
            "33": {"money": 325663, "userid": 180688669089202177},
        }
    }
    
    data = data["_default"]
    richest = sorted(data, key=lambda k: -data[k]["money"])
    
    for k in richest[:2]:  # <-- change to 10 if you want top 10
        print(
            "Money: {:<10} UserId: {}".format(data[k]["money"], data[k]["userid"])
        )
    

    【讨论】:

    • 不幸的是,这会导致错误!我收到错误:命令引发异常:KeyError: 'money' Code so far py leaderboard = {} with open("database.json") as f: leaderboard = json.load(f) f.close() print(leaderboard) richest = sorted(leaderboard, key=lambda k: -leaderboard[k]["money"]) for k in richest[:2]: # &lt;-- change to 10 if you want top 10 print( "Money: {:&lt;10} UserId: {}".format(leaderboard[k]["money"], leaderboard[k]["userid"]) )
    • 可能还注意到 print(leaderboard) 在开头给出了一个“_default”,例如 {'_default': {'1': {'money': 0, 'userid': 820839140111155200} , '10': {'money': 0, 'userid': 435960160624705547}}} 我会把它添加到我的问题中。
    猜你喜欢
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 2019-03-22
    • 2021-11-17
    • 2015-04-13
    • 2017-08-31
    相关资源
    最近更新 更多