TypeError: tuple indices must be integers or slices, not str в цикле for

Я пытался создать команду leaders (discord.py), у меня уже есть отсортированный массив с пользователями, но я не могу использовать данные в нём

Пример массива:

{"702338551806951466": {"experience": 45, "level": 3, "need_xp": 70}}

Сам код:

@client.command(aliases=['l', 'лидеры'])
async def leaders(ctx):
    with open('users.json', 'r') as f:
      users = json.load(f)
    users = sorted(users.items(), key=lambda x: x[1]['level'], reverse=True)
    embed = discord.Embed(title='Лидеры ?', colour=discord.Colour.from_rgb(randint(5,255), randint(5,255), randint(5,255)))
    for user in users:
      level = user['level'] #ошибка тут
      embed.add_field(name=user.name, value=f'Уровень: **{level}**')
    await ctx.send(embed=embed)

Ошибка:

TypeError: tuple indices must be integers or slices, not str

Как можно получить элемент массива в цикле? И как получить название массива, то-есть id человека?


Ответы (2 шт):

Автор решения: gil9red

В level = user['level'] поменяйте обращение на user[1]['level']

А чтобы получить id, то обращайтесь к user[0]

Выше вы отсортировали список ключ-значений словаря по ключу level у значения, поэтому в users у вас теперь список из кортежей вида (<ключ>, <значение>), пример элемента в users:

('702338551806951466', {'experience': 45, 'level': 3, 'need_xp': 70})
→ Ссылка
Автор решения: Сергей Ш
users = {"947336492487942174": {"experience": 6, "level": 3, "need_xp": 10},
         "702338551806951466": {"experience": 7, "level": 1, "need_xp": 10},
         "853231534433255270": {"experience": 8, "level": 4, "need_xp": 10}}
users = sorted(users.items(), key=lambda x: x[1]['level'], reverse=True)
# 1
for id_user, skill_user in users:
    print(f"{id_user} Уровень: ** {skill_user['level']} **")
# 2
for index, user in enumerate(users, 1):
    id_user, skill_user = user
    print(f"{index} {id_user} Уровень: ** {skill_user['level']} **")
→ Ссылка