好的,所以我創建了一個排行榜,并讓它顯示了獲勝次數最多的玩家。出于某種原因,當有多人贏得相同的勝利時,它只會一遍又一遍地顯示一個人的名字。
這是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 個玩家,即使他們的獲勝次數都相同。
uj5u.com熱心網友回復:
字典可以使用直接訪問(key, value)對items(),然后根據值進行排序,如如何按值對字典進行排序?
最終的簡化代碼將是:
@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按降序獲取第一個值。如果需要,您可以修改傳遞給的 lambda 以sorted()在獲勝相同時強制執行額外的排序。默認情況下,他們只會維護users.
您的原始代碼可以作業(例如,通過將每個分數直接映射到一個list而不是一個int名稱),但是這些中間結構本身并不是必需的。您的錯誤的主要原因是每個分數僅映射到一個名稱,因此具有該分數的姓氏是它唯一知道的名字。同時total,該分數存盤多次,每次都會列印相同的(姓氏)名稱。
基于聊天的更新:除了一些拼寫錯誤外,主要問題是如果找不到用戶,則get_user不和諧 API 會回傳None。OP 將調查這個問題,但如果我們只添加一個簡單的if member is not None檢查,這段代碼就解決了排序問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/394950.html
