Discord.py是否用于多次循环打印用户?

2024-10-02 08:17:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个命令,向您展示顶级[x]经验玩家 当我运行这个命令时,除了一件事之外,其他一切都很正常。它会多次打印一些用户。我检查了代码,似乎每当人们拥有与其他人相同的经验时,一个拥有相同经验的用户就会被打印多次。其余的都被跳过了

以下是py代码:


@client.command()
async def board(ctx):
    leaderboard = {}
    total = []

    with open('scratch.json','r') as f:
        users = json.load(f)


    for i in users:
        user = str(i)
        exp = int(users[user]["experience"])
        leaderboard[exp] = user
        total.append(exp)

    total = sorted(total,reverse=True)
    index=0
    for amt in total:
        id = leaderboard[amt]
        member = await client.fetch_user(id)
        print(f'{member} total: {amt}')

JSON文件:

{"320927118064222209": {"experience": 6942069420694206942069420, "level": 0}, "414066891246796811": {"experience": 694206942069420, "level": 0}, "261459418665713664": {"experience": 6969, "level": 0}, "401101596638969866": {"experience": 0, "level": 0}, "540680635652767764": {"experience": 15, "level": 0}, "373696339650805760": {"experience": 7, "level": 0}, "399823239037059094": {"experience": 6, "level": 0}, "795218993681006602": {"experience": 6, "level": 0}, "673488589996294145": {"experience": 7, "level": 0}, "754757582421229578": {"experience": 120, "level": 0}, "660774016746913802": {"experience": 96, "level": 0}, "783349784790302742": {"experience": 120, "level": 0}, "252489911611949056": {"experience": 120, "level": 0}, "447055736409686017": {"experience": 120, "level": 0}, "718933950608834602": {"experience": 20, "level": 0}, "739801844141785089": {"experience": 6, "level": 0}, "340317674875781131": {"experience": 26, "level": 0}, "574348578521350146": {"experience": 120, "level": 0}, "625239813116657664": {"experience": 0, "level": 0}, "275369873876713482": {"experience": 1, "level": 0}, "703308818523619358": {"experience": 1500, "level": 0}, "613319859870367754": {"experience": 121, "level": 0}, "701611296906412083": {"experience": 25, "level": 0}, "782219593514090506": {"experience": 0, "level": 0}, "534368639554682890": {"experience": 27, "level": 0}, "724263909003100211": {"experience": 23, "level": 0}}

打印输出:

clan1500#1500 total: 6942069420694206942069420
mnm#0384 total: 694206942069420
undefined#7426 total: 6969
OIafFromFrozen#1593 total: 1500
HappyKid123#6261 total: 121
clan2300#5041 total: 120
clan2300#5041 total: 120
clan2300#5041 total: 120
clan2300#5041 total: 120
clan2300#5041 total: 120
DemonInvis#0479 total: 96
wawawa#0001 total: 27
Henlo there#3752 total: 26
plant#7541 total: 25
ٴٴٴٴٴٴٴٴٴٴٴٴٴٴٴٴٴٴٴٴٴٴٴٴ#0837 total: 23
sak <3#9556 total: 20
AirFloating#6890 total: 15
1_Ninaaa#6779 total: 7
1_Ninaaa#6779 total: 7
MrAaksh#1704 total: 6
MrAaksh#1704 total: 6
MrAaksh#1704 total: 6
menace#0210 total: 1
liz0216#8045 total: 0
liz0216#8045 total: 0
liz0216#8045 total: 0

提前谢谢


Tags: 代码用户命令client经验leveluserstotal
2条回答

这是因为JSON使用键值对。如果您正在按经验量进行搜索,它将首先选择具有相应经验量的id。我自己没有运行代码,但我也怀疑代码:

exp = int(users[user]["experience"])
leaderboard[exp] = user

可能会用新用户覆盖现有体验值,而不是添加新体验&;用户输入

您的问题是dict排行榜将体验映射到单个用户,其中可能有许多用户具有相同的体验。然而,在总列表中,您存储了所有体验(具有重复项) 我猜您想要的是向所有用户展示相同的体验。在这种情况下,您应该执行以下操作吗

for i in users:
        exp = int(users[user]["experience"])
        if exp not in leaderboard:
            leaderboard[exp]=list()
        leaderboard[exp].append(user)

上面发生的事情是:您将所有用户存储在映射到其exp的列表中

然后你把它打印出来

for exp, users_with_same_exp in leaderboard.items():
    for each_users in  users_with_same_exp:
          do your fetch here...

一旦你理解了这段代码,看看默认的dict,让你的生活变得简单一点

相关问题 更多 >

    热门问题