Я пытаюсь отсортировать JSON по высокому баллу, но это не работает. Мой JSON:
{"players": [{"test": [{"high_score": 1000}]}, {"test1": [{"high_score": 1200}]}, {"test2": [{"high_score": 3000}]}]}
Мой Питон:
with open('score.json', "r") as json_file:
data = json.load(json_file)
json_file.close()
sorted_obj = data
sorted_obj['players'] = sorted(data['players'], key=lambda x: x['high_score'], reverse=True)
print(sorted_obj)
Выход:
sorted_obj['players'] = sorted(data['players'], key=lambda x: x['high_score'], reverse=True)
KeyError: 'high_score''
Я хочу, чтобы вывод был:
{"players": [{"test2": [{"high_score": 3000}]}, {"test1": [{"high_score": 1200}]}, {"test": [{"high_score": 1000}]}]}
Кто-нибудь знает, как это решить? Спасибо
если мой ответ полезен, отметьте его как принятый.
Вам не нужно вызывать .close()
, когда вы используете диспетчер контекста (with ...
). Контекстный менеджер вызывает .close()
для вас, вот и весь смысл.
Ваша структура JSON бесполезна во многих отношениях. Если вы не можете его изменить, это работает (я не буду объяснять, почему, если у вас возникли проблемы с этим, примите это как указание на то, что что-то серьезно не так с вашей структурой данных, потому что это не должно быть так сложно). .)
with open('score.json', "r") as json_file:
data = json.load(json_file)
data['players'] = sorted(data['players'], key=lambda p: p[list(p.keys())[0]][0]['high_score'], reverse=True)
print(data)
С более разумной структурой входных данных все вдруг становится проще.
{"players": [
{"name": "test", "high_score": 1000},
{"name": "test1", "high_score": 1200},
{"name"; "test2", "high_score": 3000}
]}
и
data['players'] = list(sorted(data['players'], key=lambda p: p['high_score'], reverse=True))
Спасибо, ваша структура данных намного лучше
@krystof18 Главный недостаток в том, что нельзя проиндексировать игрока по имени, т.е. нельзя сделать that_player = data['players']['test1']
. Но этот недостаток очень легко преодолеть: that_player = next(p for p in data['players'] if p['name'] == 'test1')
.
@krystof18 В качестве альтернативы, создание временного справочника также достаточно просто by_name = {p['name']: p for p in data['players']}
Ваша структура JSON не имеет никакого смысла. Пожалуйста, не говорите, что вы должны использовать это и не можете его изменить.