Создание темы и системы оценок в Python

#python #list

#python #Список

Вопрос:

Я пытаюсь создать систему оценок для проекта UNI. нам сказали, что у нас есть 3 глобальных списка:

 Emner = ["INFO100","INFO104","INFO110","INFO150","INFO125"]
FagKoder = [["Informasjonsvitenskap","INF"],["Kognitiv vitenskap","KVT"] 
Karakterer=[["INFO100","C"],["INFO104","B"],["INFO110","E"]]
  

Предполагается, что с помощью этих списков мы создадим способ просмотра предметов (Emner) с оценками из Karakterer, но мы также должны иметь возможность просматривать предметы без оценок. Он должен отображаться следующим образом:

Представление о том, как печатать предметы с оценками и без оценок Мы также должны иметь возможность добавлять новые предметы в (Emner) и добавлять новые оценки в (Karakterer). Все это должно отображаться как на картинке выше.

Я пробовал всевозможные способы сделать это, но я продолжаю возвращаться к одной из двух проблем. Либо я не могу напечатать тему без оценки, либо, если я добавлю новую тему (Emne) и захочу добавить оценку (Karakter), я не смогу поместить ее в нужную тему, так как она просто сохраняется в первой теме без оценки.

надеюсь, кто-нибудь сможет помочь мне с этим, сходя здесь с ума!

Код, который я пока:

 def emneliste():
global Emner
global Karakterer
emne,kar = zip(*Karakterer)
ans = [list(filter(None, i)) for i in itertools.zip_longest(Emner,kar)]

def LeggTilEmne():
global Karakterer
global Emner
nyttEmne = input("Skriv ny emnekode (4Bokstaver   3 tall): ")
if nyttEmne not in Emner:
    while re.match('^[A-Å]{3,4}[0-9]{3}$',nyttEmne):
            Emner.append(nyttEmne)
            print(nyttEmne   " Er lagt til!")
            start()
            print("Feil format")
            LeggTilEmne()

else:
    print("Dette Emnet er allerede i listen din")
    start()

def SettKarakter():
global Karakterer
global Emner
VelgEmne = input("Hvilke emne? ")

Emne,Karakter = zip(*Karakterer)
if str(VelgEmne)  not in str(Emner):
    print("Dette faget er ikke i din liste")
    feil = input("om du heller ønsket å opprette fag trykk 2, ellers trykk enter ")
    if feil == str(2):
      LeggTilEmne()
    else:
      start()

else:
      if str(VelgEmne) in str(Karakterer):
        index = Karakterer.index([VelgEmne,"C"])
        Karakterer.pop(index)
        SettKar = input("Karakter? ")
        Emner.append([VelgEmne,SettKar])
        print("Karakter "   SettKar   " Er Lagt til i "   VelgEmne)
        start()
      else:
        SettKar = input("Karakter? ")
        if str(VelgEmne) in str(Emner):
          index = Emner.index(VelgEmne)
          print(index)
          Emner.pop(index)
          Emner.insert(index,[VelgEmne,SettKar])
          print("Karakter "   SettKar   " Er Lagt til i "   VelgEmne)
          start()
        else:
          print("Virker Ikke")
          start()
  

Комментарии:

1. Покажите попытки кода, которые вы пробовали.

Ответ №1:

Вместо этого вы можете создать Karakterer dict, чтобы можно было перебирать темы в Emner и эффективно искать, находится ли тема в Karakterer с in помощью оператора:

 Karakterer = dict(Karakterer)
for subject in Emner:
    print(*([subject]   ([Karakterer[subject]] if subject in Karakterer else [])))
  

Это выводит:

 INFO100 C
INFO104 B
INFO110 E
INFO150
INFO125
  

Ответ №2:

Вот обновленная демонстрация класса GradeHandler. Я попытался разрешить обновление оценок, удаление предметов и т.д.:

 __name__ = 'DEMO'

class GradeHandler(object):

    EMNER = ["INFO100","INFO104","INFO110","INFO150","INFO125"]
    FAGKODER= [["Informasjonsvitenskap","INF"],["Kognitiv vitenskap","KVT"]]
    KARAKTERER = [["INFO100","C"],["INFO104","B"],["INFO110","E"]]

    def __init__(self):
        self.Emner = self.EMNER
        self.FagKoder = self.FAGKODER
        self.Karakterer = self.KARAKTERER
        self.__create_grade_dict()



    def remove_subject(self, subject_name):
        """
        Remove a subject ot the classes class list variable.
        """
        try:
            self.Emner = [i for i in self.EMNER if i != subject_name]
            self.__create_grade_dict()
        except ValueError:
            pass


    def add_subject(self, subject_name):
        """
        Append a subject ot the classes class list variable.
        """
        if not subject_name in Emner:
            self.Emner.append(subject_name)
            self.__create_grade_dict()



    def __create_grade_dict(self, grade_dict=None):
        """
        Split grades matrix into separate parts; Create and set a dictionary of values.
        """
        if grade_dict is None:
            self.grade_dict = dict()

        sub, grade = zip(*self.Karakterer)
        karakterer_dict = {k:v for k, v in list(zip(sub, grade))}

        for i in self.Emner:
            if i in karakterer_dict.keys():
                self.grade_dict[i] = karakterer_dict[i]
            else:
                self.grade_dict[i] = ''



    def update_grade(self, subject_name, grade='A'):
        """
        Update a grade in the grade dictionary.
        Will also add a subject if not alrady in the dictionary.
        """
        try:
            self.grade_dict[subject_name] = grade
        except (KeyError, ValueError):
            pass




    def print_grades(self, subject_name=None):
        """
        Print dictionary results.
        """
        if subject_name is None:
            for k, v in self.grade_dict.items():
                print('{} {}'.format(k, v))

        else:
            if subject_name in self.grade_dict.keys():
                print('{} {}'.format(subject_name, self.grade_dict[subject_name]))




if __name__ == 'DEMO':

    ### Create an instance of the GradeHandler and print initial grades.
    gh = GradeHandler()
    gh.print_grades()


    ### Append a class
    gh.add_subject('GE0124')
    gh.print_grades()


    ### Add grade 
    gh.update_grade('GE0124', 'B ')
    gh.print_grades()


    ### Update grades
    gh.update_grade('GE0124', 'A-')
    gh.print_grades()


    ### Remove subject (will also remove grade.
    gh.remove_subject('GE0124')
    gh.print_grades()