Переписывает значение в ключе

Почему при открытии файла он переписывает значение, которые были добавлены на прошлом шаге, а в конечном итоге в ключ points передаёт последнюю строку из файла?

Первый шаг:

{'100': {'question': 'plane', 'answer': 'самолёт', 'asked': 'False'}}`

Второй шаг:

{'100': {'question': 'train', 'answer': 'поезд', 'asked': 'False'}, 
 '200': {'question': 'train', 'answer': 'поезд', 'asked': 'False'}}

(переписал прошлое значение ключа 100, хотя я обращаюсь к ключу 200)

def load_question():
    qwestions = {}
    mean = {}
    display = {}
    with (open("qwestions.txt", encoding='utf-8') as file):
        for word in file:
            if word.count(' ') < 2 and word != '\n':
                key = word.rstrip()
                #print(key)
            elif word.count(' ') == 3:
                points, question, answer, asked = word.rstrip().split(' ')
                display['question'] = question
                display['answer'] = answer
                display["asked"] = asked
                mean[points] = display
                qwestions[key] = mean
                print(points)
                print(mean)
                #print(qwestions)
            else:
                continue

    print(qwestions)

Пример файла qwestions.txt:

Транспорт
100 plane самолёт False
200 train поезд False
300 boarding посадка False
Животные
100 dog собака False
200 shark акула False
300 sparrow воробей False
Еда
100 apple яблоко False
200 berry ягода False
300 venison оленина False

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

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

Анализ:

У вас 3 уровня словарей:

  • главный (итоговый), которой вы называете qwestions
    (правильно по-английски бы хотелось questions),
  • средний (по темам, как Транспорт или Животные) - вы его называете mean
    (хотелось бы middle, т.к. mean означает статистическое среднее значение),
  • внутренний (вопросы по данной теме), который вы называете display.

Ошибка в вашем коде состоит в том, что кроме главного словаря,

    словари остальных уровней нужно в правильный момент обнулять.

Именно

  • средний при появлении нового ключа,
  • внутренний при появлении нового вопроса.

Исправление:

Команды

mean = {}
display = {}

из начала вашей программы нужно переместить в правильные места:

  • первую в вашу ветвь if (т.е. при появлении нового ключа),
  • вторую в elif (т.е. при появлении нового вопроса),

вот так:

        ...
        if word.count(' ') < 2 and word != '\n':
            mean = {}
            key = word.rstrip()
            #print(key)
        elif word.count(' ') == 3:
            display = {}
            points, question, answer, asked = word.rstrip().split(' ')
            ...

Результат (словарь qwestions) - я использовал стандартный модуль pprint для его вывода:

{'Транспорт': {'100': {'question': 'plane', 'answer': 'самолёт', 'asked': 'False'},
               '200': {'question': 'train', 'answer': 'поезд', 'asked': 'False'},
               '300': {'question': 'boarding', 'answer': 'посадка', 'asked': 'False'}},
 'Животные':  {'100': {'question': 'dog', 'answer': 'собака', 'asked': 'False'},
               '200': {'question': 'shark', 'answer': 'акула', 'asked': 'False'},
               '300': {'question': 'sparrow', 'answer': 'воробей', 'asked': 'False'}},
 'Еда':       {'100': {'question': 'apple', 'answer': 'яблоко', 'asked': 'False'},
               '200': {'question': 'berry', 'answer': 'ягода', 'asked': 'False'},
               '300': {'question': 'venison', 'answer': 'оленина', 'asked': 'False'}}}
→ Ссылка