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']} **")