0

我正在尝试创建一个命令,向您展示顶级 [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

提前致谢!

4

2 回答 2

2

您的问题是 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 让你的生活更轻松一些

于 2021-01-31T13:26:46.010 回答
0

这是因为 JSON 使用键值对。如果按经验值搜索,会选择第一个id对应的经验值。我自己没有运行代码,但我也怀疑代码:

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

可能会用新用户覆盖现有体验值,而不是添加新体验和用户条目。

于 2021-01-31T13:22:21.440 回答