Как отсортировать массив json по его элементу?

Как отсортировать массив json в python?

В данном случае я пытаюсь реализовать команду leaders (discord.py) в которой нужно отсортировать json-массив "users" по int-элементу level.

Массив:

{"947336492487942174": {"experience": 6, "level": 1, "need_xp": 10}, "702338551806951466": {"experience": 7, "level": 3, "need_xp": 10}, "853231575332552704": {"experience": 8, "level": 6, "need_xp": 10}}

Сам код:

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

Ошибка:

TypeError: string indices must be integers

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

Автор решения: Павел

Проблема в том, что у вас словарь вложенный, а написанная вами сортировка этого не учитывает.

Для решения достаточно получить внутренние словари и уже тогда сортировать по значению поля level:

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}}

print(sorted(users.items(), key=lambda x: x[1]['level']))

Вывод:

[('702338551806951466', {'experience': 7, 'level': 1, 'need_xp': 10}), 
 ('947336492487942174', {'experience': 6, 'level': 3, 'need_xp': 10}), 
 ('853231534433255270', {'experience': 8, 'level': 4, 'need_xp': 10})]
→ Ссылка