@max_1O

Не могу добавить список в json?

Здравствуйте. Помогите разобраться, что не так с кодом, вопрос объясню в комментариях кода. Заранее благодарю

# код сравняет набранные очки и сохраняет рекорды в scores.json
def save_high_score(stats, settings, date_now, hour_now):
    with open('data/scores.json', 'r') as file:
        data = json.load(file)
        scores = data['scores'] #  список рекордных очков
        dates = data['dates'] # список времён когда была зарегистрована рекорд
        # для теста
        print("loaded score date data:", scores, dates, "len:", len(scores), len(dates)) 

    # список должна быть длины не более 7(установлена в settings.amount_of_score_labels)
    if len(scores) >= settings.amount_of_score_labels: 
        # заработает если список достиг лимита(седьмого индекса)
        for index in range(len(scores)):
            # сравниваем набранные очки и установленные ранее рекорды
            if int(stats.score) == int(scores[index]):
                # если уже есть такой рекорд, выйдем из цикла
                break
            elif int(scores[index])<int(stats.score):
                # если есть побитый рекорд, добавляем нового и убираем лишний индекс
                dates.insert(index, f"{date_now} - {hour_now}")
                scores.insert(index, stats.score)
                dates = dates[:7]
                scores = scores[:7]
                break
    elif len(scores)<settings.amount_of_score_labels:
        # заработает если список рекордов не достиг лимита(ниже 7)
        for index in range(len(scores)):
            # если уже есть такой рекорд, выйдем из цикла
            if int(stats.score) == int(scores[index]):
                break
            elif int(scores[index])<int(stats.score):
                # добавляем новый рекорд в соответствующем месте
                dates.insert(index, f"{date_now} - {hour_now}")
                scores.insert(index, stats.score)
                break
    elif len(scores) == 0:
        # заработает только в самом начале записи рекордов
        dates.append(f"{date_now} - {hour_now}")
        scores.append(stats.score)
    print(scores, dates) # для теста
    for obj in data:
        obj['dates'] = []
        # программа вывела ошибку в строке выше, текст ошибки ниже
        # TypeError: 'str' object does not support item assignment
        # в чем дело? я вроде список дал в значении obj['dates']
        obj['scores'] = []
        obj['dates'].extend(dates)
        obj['scores'].extend(scores)
    with open('data/scores.json', 'w') as file:
        file.write(data)
        file.close()

scores.json
{
    "dates": [],
    "scores": []
}
  • Вопрос задан
  • 58 просмотров
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix Куратор тега Python
yellow
obj - строка, не словарь. Распечатайте ее хоть, посмотрите.

Итерирование словаря через for ... in ... возвращает имя ключа, ключа у вас два: dates и scores. Получаете 'dates'['dates'] = []
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы