排行榜discord.py存在问题

时间:2020-11-11 15:38:38

标签: discord.py

排行榜显示相同的用户名,即使它们是不同的用户(如果它们具有相同的值)。 我不知道如何解决这个问题,但是当我在代码中要求抵抗一个变量时,它只给我3个元素,即使有4个元素也没有给我4个元素。 required

代码:

@client.command(aliases = ["lb"])
async def leaderboard(ctx,x = 10):
    leader_board = {}
    total = []
    for user in economy_system:
        name = int(user)
        total_amount = economy_system[user]["wallet"] + economy_system[user]["bank"]
        leader_board[total_amount] = name
        total.append(total_amount)
    print(leader_board)
    total = sorted(total,reverse=True)
    embed = discord.Embed(
        title = f"Top {x} Richest People",
        description = "This is decided on the basis of raw money in the bank and wallet",
        color = 0x003399
    )
    index = 1
    for amt in total:
        id_ = leader_board[amt]
        member = client.get_user(id_)
        name = member.name
        print(name)
        embed.add_field(
            name = f"{index}. {name}",
            value = f"{amt}",
            inline = False
        )
        if index == x:
            break
        else:
            index += 1

    await ctx.send(embed=embed)

印刷品对此表示反对:

{100: 523967502665908227, 350: 554617490806800387, 1100: 350886488235311126}
Padre Mapper
Flore (Orsolinismo)
Aetna
Aetna

理论上也应该有100: 488826524791734275(即我的用户ID),但是找不到。

1 个答案:

答案 0 :(得分:0)

您的问题来自此行:

leader_board[total_amount] = name

如果total_amount已经是一个密钥(例如,两个用户拥有相同的金额),它将替换之前的值(这是一个用户ID),并用另一个用户ID替换它。在这种情况下,如果多个用户拥有相同的金额,则leader_board中将只保存一个。

然后,您有以下一行:

total.append(total_amount)

在这种情况下,如果两个用户拥有相同的金额,则您将只有两个相同的值,这是正常的,但是考虑到上述问题,这将造成转移。

假设您有十个用户,其中两个拥有相同金额。 leader_board仅包含9个项目,而total将包含10个值。这就是为什么您的消息中有两个同名的原因。

要解决此问题:

@client.command(aliases = ["lb"])
async def leaderboard(ctx, x=10):
    d = {user_id: info["wallet"] + info["bank"] for user_id, info in economy_system.items()}
    leaderboard = {user_id: amount for user_id, amount in sorted(d.items(), key=lambda item: item[1], reverse=True)}

    embed = discord.Embed(
        title = f"Top {x} Richest People",
        description = "This is decided on the basis of raw money in the bank and wallet",
        color = 0x003399
    )

    for index, infos in enumerate(leaderboard.items()):
        user_id, amount = infos
        member = client.get_user(user_id)
        embed.add_field(
            name = f"{index}. {member.display_name}",
            value = f"{amount}",
            inline = False
        )

    await ctx.send(embed=embed)

如果我猜对了,而您的词典是这样组织的,它应该可以工作:

economy_system = {
    user_id: {"bank": x, "wallet": y}
}