Я создаю программу, которая работает как база данных, которая хранит студентов как объекты.Каждый объект (студент) имеет три атрибута: имя, класс и средний.Я пытаюсь включить бинарный поиск, чтобы пользователь мог искать в среднем.Если среднее значение найдено в одном из атрибутов объекта, то программа должна отобразить объект.Сейчас я пытаюсь заставить бинарный поиск работать;если я ищу среднее значение, которое хранится в четном индексе, то оно работает, однако оно не работает для любых нечетных индексов.Кто-нибудь знает, почему это происходит?Кроме того, я пытаюсь отобразить объект, который содержит среднее значение, в котором выполняется поиск, но до сих пор мне удавалось отобразить только местоположение индекса объекта, который содержит искомое среднее.Любая помощь с отображением объекта будет принята с благодарностью!
Моя программа выглядит следующим образом:
import pickle
class Student():
def __init__(self,nam,grd,avg):
self.name = nam
self.grade = grd
self.average = avg
def get_details(self):
print(self.name, self.grade, self.average)
def unpickle_database(filename):
with open(filename, 'rb') as f:
while True:
try:
yield pickle.load(f)
except EOFError:
break
def display_database():
print("\nName: Grade: Average: ")
for student in unpickle_database('student_data.pkl'):
property_list = [student.name, student.grade, student.average]
print(''.join([v.ljust(20,' ') for v in property_list]))
def store_averages_in_list():
students = list(unpickle_database('student_data.pkl'))
students_average = []
for student in students:
students_average.append(int(student.average))
return students_average
def bin_search(x, type):
my_list = list(sorted(store_students_in_list(), key=attrgetter(type), reverse=False))
bottom = 0
top = len(my_list)-1
found = False
location = -1
while (bottom <= top) and not(found):
middle = int((bottom + top)/2)
if (my_list[middle] == x):
location = middle
found = True
elif (my_list[middle] < x):
bottom = middle + 1
else:
top = middle -1
return location
while True:
user_input = input()
if user_input == "Search":
print(bin_search(int(input("Enter average to search for: ")),'average'))