Задать вопрос
@isOdin

Как исправить проблему: if не читает словарь?

У меня в коде на 39 строке(
if lesson_say in users_data[user_name][lesson_assessments_list]
) выводит ошибку: TypeError, когда написано users_data[user_name][lesson_assessment_list]. Но если просто user_data, то if не читает данные и пропускает их. Может кто-то знает как исправить?
import pickle
play = True
user_list = []
password_list = []
lesson_assessments = []
lesson_assessments_list = [] # 
users_data = dict()
lessons = ["Алгебра", "Геометрия", "Русский язык", "Литература", "Информатика", "География", "История", "Английский язык", "Физкультура", "Обществознание", "Технология", "ИЗО", "Музыка", "Биология", "Физика", "ОБЖ"]
try:
    opn_f = open('datafile.data', 'rb')
except IOError:
    None
else:
	users_data = pickle.load(opn_f)
	user_list = pickle.load(opn_f) #
	password_list = pickle.load(opn_f)
	lesson_assessments_list = pickle.load(opn_f)
	lesson_assessments = pickle.load(opn_f)
while play:
	play_2= True
	while play_2:
		print("Здравствуйте! Введите ваш логин и пароль или зарегистрируйтесь(reg).")
		user_name = input("логин: ")
		if user_name in user_list:
			login = user_list.index(user_name)
			user_password = input("пароль: ")
			if user_name == user_list[login] and user_password == password_list[login]:
				el_sum = 0
				quantity = 0
				check_lesson = True
				while check_lesson:
					print('Какой урок вас интересует?\n',lessons,'\n Введите его :')
					lesson_say = input()
					users_data[user_name] = lesson_assessments, lesson_assessments_list	
					check_numbers = True
					while check_numbers:
						check_numbers_2 = True
						while check_numbers_2:
							print(users_data)
							print(lesson_assessments_list)
							print(lesson_assessments)							
							if lesson_say in users_data[user_name][lesson_assessments_list]:	#данные про урок есть
								index = users_data[user_name][lesson_assessments_list].index(lesson_say)
								print(index)
								print('__________________')
								print('Ваш средний бал по {0}'.format(lesson_say),': ',users_data[user_name][lesson_assessments[index]] )
								exit = input("Вы можете выбрать другой урок, написав urok, продолжить набор оценок, написав next, "
										"удалить средний балл и ввести его заново,написав point, сохранить все ваши данные,написав save или выйти из приложения, написав exit: ")
								if exit == 'exit':
									print("Спасибо, что воспользовались нашим приложением")
									opn_f = open('datafile.data', 'wb')
									pickle.dump(users_data, opn_f)
									pickle.dump(user_list, opn_f)
									pickle.dump(password_list, opn_f)
									pickle.dump(lesson_assessments, opn_f)
									pickle.dump(lesson_assessments_list, opn_f)
									opn_f.close()
									play = False
									play_2 = False
									check_lesson = False
									check_numbers = False
									check_numbers_2 = False
								elif exit == 'urok':
									el_sum = 0
									quantity = 0
									check_numbers_2 = False
									check_numbers = False
								elif exit == 'next':
									check_say_3 = True
									while check_say_3:
										check_say_4 = True
										while check_say_4:
											a = int(input("Введите число или напишите 0 для подсчёта ваших оценок: "))
											quantity += 1
											el_sum += a
											if a > 5 :
												print("Вводите число не более 5")
												check_say_4 = False
												el_sum -= a
												quantity -= 1
											if a == 0 :
												check_group_2 = True
												while check_group_2:
													if quantity > 2 :
														quantity -= 1
														assessments = el_sum / quantity
														users_data[user_name][lesson_assessments[index]] = users_data[user_name][lesson_assessments[index]] + assessments
														check_group_2 = False
														check_say_4 = False
														check_say_3 = False
													elif quantity < 2:
														quantity -= 1
														print("Введите ещё {0}".format(3 - quantity)," для подсчёта")
														check_group_2 = False
											elif a < 1:
												print("Вводите число не менее 1")
												check_say_4 = False
												el_sum -= a
												quantity -= 1
								elif exit == 'point':
									lesson_assessments[index] = 0
									check_say  = False
									check_group = False
								else:
									print("Такой команды нет")
							else:
								if lesson_say in lessons:		#данных про урок нет
									check_say_2 = True
									while check_say_2:
										check_say = True
										while check_say:
											a = int(input("Введите число или напишите 0 для подсчёта ваших оценок: "))
											quantity += 1
											el_sum += a
											if a > 5 :
												print("Вводите число не более 5")
												check_say = False
												el_sum -= a
												quantity -= 1
											if a == 0 :
												check_group = True
												while check_group:
													if quantity > 2 :
														quantity -= 1
														assessments = el_sum / quantity
														lesson_assessments.append(assessments)
														lesson_assessments_list.append(lesson_say)
														users_data[user_name] = lesson_assessments, lesson_assessments_list	# 
														print('__________________')
														print('Ваш средний бал по {0}'.format(lesson_say),': ', assessments)
														exit = input("Вы можете выбрать другой урок, написав urok, продолжить набор оценок, написав next, "
																"удалить средний балл и ввести его заново,написав point, сохранить все ваши данные,написав save или выйти из приложения, написав exit: ")
														if exit == 'exit':
															print("Спасибо, что воспользовались нашим приложением")
															opn_f = open('datafile.data', 'wb')
															pickle.dump(users_data, opn_f)
															pickle.dump(user_list, opn_f)
															pickle.dump(password_list, opn_f)
															pickle.dump(lesson_assessments, opn_f)
															pickle.dump(lesson_assessments_list, opn_f)
															opn_f.close()
															play_2 = False
															play = False
															check_lesson = False
															check_numbers = False
															check_numbers_2 = False
															check_say_2 = False
															check_say = False
															check_group = False
														elif exit == 'urok':
															el_sum = 0
															quantity = 0
															check_numbers_2 = False
															check_numbers = False
															check_group = False
															check_say = False
															check_say_2 = False
														elif exit == 'next':
															check_say = False	
															check_group = False
														elif exit == 'point':
															el_sum = 0
															quantity = 0
															check_say  = False
															check_group = False
														else:
															print("Такой команды нет")
															quantity += 1
													elif quantity < 2:
														quantity -= 1
														print("Введите ещё {0}".format(3 - quantity)," для подсчёта")
														check_group = False
											elif a < 1:
												print("Вводите число не менее 1")
												check_say = False
												el_sum -= a
												quantity -= 1
								else:
									print ("У вас нет такого урока")
									check_numbers = False
									check_numbers_2 = False
			else:
				print("В базе нет вашей учётной записи или логин или пароль неправильны")
				break
		elif user_name == 'reg':
			check_new_user_name = True
			while check_new_user_name:
				check_new_user_name_2 = True
				while check_new_user_name_2:
					new_user_name = input("Введите ваш новый логин: ")
					if new_user_name in user_list:
						print("Такой пользователь уже есть. Введите другой логин.")
						check_new_user_name_2 = False
					else:
						check_new_user_name = False
						check_new_user_name_2 = False
			check_new_password = True
			while check_new_password:
				new_user_password = input("Введите ваш новый пароль: ")
				check_new_password = False
			user_list.append(new_user_name)
			password_list.append(new_user_password)		
			play_2 = False
# данные должны сохраняться только на этой учётной записи
  • Вопрос задан
  • 121 просмотр
Подписаться 1 Простой 2 комментария
Решения вопроса 1
@Al6xand6r
Здесь присваивается кортеж:
users_data[user_name] = lesson_assessments, lesson_assessments_list
,
а здесь: users_data[user_name][lesson_assessments_list] вы пытаетесь обращаться к элементу кортежа как значению словаря.
Попробуйте так:
users_data[user_name][1]
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы