Переписывает значение в ключе
Почему при открытии файла он переписывает значение, которые были добавлены на прошлом шаге, а в конечном итоге в ключ 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'}}}