Как использовать бинарный поиск, чтобы найти атрибут объекта pickle - PullRequest
0 голосов
/ 04 июня 2018

Я создаю программу, которая работает как база данных, которая хранит студентов как объекты.Каждый объект (студент) имеет три атрибута: имя, класс и средний.Я пытаюсь включить бинарный поиск, чтобы пользователь мог искать в среднем.Если среднее значение найдено в одном из атрибутов объекта, то программа должна отобразить объект.Сейчас я пытаюсь заставить бинарный поиск работать;если я ищу среднее значение, которое хранится в четном индексе, то оно работает, однако оно не работает для любых нечетных индексов.Кто-нибудь знает, почему это происходит?Кроме того, я пытаюсь отобразить объект, который содержит среднее значение, в котором выполняется поиск, но до сих пор мне удавалось отобразить только местоположение индекса объекта, который содержит искомое среднее.Любая помощь с отображением объекта будет принята с благодарностью!

Моя программа выглядит следующим образом:

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'))
...