【问题标题】:How to fix multiple values being displayed in discord.py embed leaderboard如何修复 discord.py 嵌入排行榜中显示的多个值
【发布时间】:2022-01-25 18:07:32
【问题描述】:

好的,所以我创建了一个排行榜,并让它显示获胜次数最多的玩家。出于某种原因,当多人获得相同数量的胜利时,它只会一遍又一遍地显示一个人的名字。

这里是main.py

@client.command()
@commands.cooldown(1,5, BucketType.user)
async def leaderboard(ctx, x = 1):
    users = await get_win_data()
    leader_board = {}
    total = []
    for user in users:
        name = int(user)
        total_amount = users[user]["Wins"]
        leader_board[total_amount] = name
        total.append(total_amount)
    
    total = sorted(total, reverse=True)

    demb = discord.Embed(title = f"Top  winners!", descripition = "These are the people with the most amount of wins.", color=discord.Color.red())
    index = 1 
    for wins in total:
        id_ = leader_board[wins]
        member = client.get_user(id_)
        name = member.name
        demb.add_field(name = f"{index}. {name}", value=f"Won **{wins}** times", inline=False)
        if index == x:
            break
        else:
            index += 1 

    
    await ctx.send(embed = demb)

这是json

{
    "427924596164132864": {
        "Wins": 1
    },
    "441638109587832842": {
        "Wins": 1
    },
    "479527342860140544": {
        "Wins": 1
    }
}

我想知道是否有任何方法可以显示所有 3 名玩家,即使他们的获胜次数都相同。

【问题讨论】:

  • 你能解释一下x的用法吗?现在,您的代码将分数映射到一个名称(这就是它没有 3 个不同名称的原因),将每个分数添加到列表中,按降序对其进行排序并循环。对已有的 users dict 进行排序和循环会更好。
  • 这是为了将排行榜限制在x位置吗?
  • @shriakhilc 正确当有人运行 ?leaderboard 5 时它会显示 5 个位置,因此该命令中的 5 将是 x

标签: python json discord discord.py


【解决方案1】:

字典可以使用items() 直接访问(key, value) 对,然后根据How do I sort a dictionary by value? 中所述的值进行排序

最终的简化代码为:

@client.command()
@commands.cooldown(1,5, BucketType.user)
async def leaderboard(ctx, x = 1):
    users = await get_win_data()
    iterator = sorted(users.items(), key=lambda item: item[1]["Wins"], reverse=True)
    demb = discord.Embed(title = f"Top  winners!", descripition = "These are the people with the most amount of wins.", color=discord.Color.red())
    
    count = 1
    for id_, data in iterator:
        member = client.get_user(id_)
        if member is not None:
            demb.add_field(name = f"{count}. {member.name}", value=f"Won **{data['Wins']}** times", inline=False)
            if count == x:
                break
            else:
                count += 1
        else:
            # Handle missing users based on your application
            print(f"user ID {id_} is missing.")
    
    await ctx.send(embed = demb)

就像在您的代码中一样,这采用降序排列的第一个 x 值。如果需要,您可以修改传递给 sorted() 的 lambda,以在获胜次数相同时强制执行附加排序。默认情况下,他们只会维持 users 中已有的任何顺序。


您的原始代码可以正常工作(例如,通过将每个分数直接映射到 list 而不是 int 名称),但这些中间结构本身并不是必需的。您的错误的主要原因是每个分数只映射到一个名称,因此具有该分数的姓氏是它唯一知道的。同时total 多次存储该分数,每次都会打印相同的(姓氏)名称。


基于聊天更新:除了一些拼写错误外,主要问题是如果找不到用户,get_user discord API 会返回 None。 OP 会调查这个问题,但是如果我们只添加一个简单的if member is not None 检查,这段代码就可以解决排序问题。

【讨论】:

  • 您提供的代码在运行命令时仍然显示一个名称
  • 一个名字,你的意思是它显示一个人(因为默认x=1)还是重复相同的name多次?如果 users 的 JSON 是正确的,这是不可能的。如果 json 本身可以有重复项,则需要附加条件。您还可以检查它是否只是 name 重复,甚至是 id_?您也可以将id_ 添加到 f 字符串中。
  • @shriakhlic 它多次重复同一个名字
  • 除非多个id_ 在您的不和谐服务器上具有相同的用户名,或者问题中的信息不正确,否则我想不出为什么会失败。如果您想进一步调试,我们可以在聊天室中讨论。
  • 好的,我加入了
猜你喜欢
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2014-09-10
  • 2021-03-23
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多