Найти - Пользователи
Полная версия: Проблема с подсчётом оценок через оператор if и elif
Начало » Python для новичков » Проблема с подсчётом оценок через оператор if и elif
1
Typical_beginer
Добрый день
Продолжаю постигать Python и возникла простая,на первый взгляд проблема.

Есть оценки по 3-ём дисциплинам(markgeometry,markalgebra,markinformatika)Мне надо посчитать количество 3,4,5 со всех объектов класса.

Проблемный участок кода ниже,всю программу не выкладываю,так как остальные блоки пока работают правильно.
Сразу напишу,что я тут предствавляю.
Цикл прохода по коллекции,входим в цикл. И начинаем с помощью условного оператора считать оценки.
То есть если по markgeometry стоит 3 или по markalgebra стоит 3 или по markinformatika стоит 3, то мы обновляем счётчик.
Аналогично и к другим оценкам. То есть условие в цикле проверяет каждый атрибут класса и если там есть указанная в условии оценка,то всё это добавляется в счётчик.

           countfour1=0
          countfive1=0
          counttri=0
          for student in studinfos:
                 if (student.markgeometry==5) or (student.markalgebra==5) or (student.markinformatika==5):
                     countfive1+=1
                 elif (student.markgeometry==4) or (student.markalgebra==4) or (student.markinformatika==4):
                      countfour1+=1
                 elif (student.markgeometry==3) or (student.markalgebra==3) or (student.markinformatika==3):
                      counttri+=1
          print("Количество 5-рок = ", countfive1)
          print("Количество 4-рок = ", countfour1)
          print("Количество 3-ек = ", counttri)

Прикрепляю скриншот,и как вы видите там явно больше 3,4,5 при вводе и меньше после выполнения блока.
В одном случае у меня посчитало(И то неправильно, в другом показывает 0)Сразу напишу было и if вместо elif(но это ошибка), в условиях было вместо or -> and и убирал скобки из оператора ветвления.

Также ставил точки остановки и смотрел по-шаговое выполнение. Он всё видит, но не считает.
Сам оператор инкримента стоит правильно,потому что я в другой функции считаю студентов и он выводит правильное количество.

PEHDOM
Две причины:
Первая - конструкции if-elif-else работают до первого вхождения. Если первый if сработал то все остальное не сработают. Это просто замена вложеных if-ов, чтоб не так глаза мозолили.
  
if:
else:
    if:
    else:
        if:
        else:
У вас, если нашли у Иванова пятерку, то тройки и четверки уже не ищем.
Вторая - если у Петрова две четверки: по алгебре и геометрии то ваше:
 elif (student.markgeometry==4) or (student.markalgebra==4) or (student.markinformatika==4):
                      countfour1+=1
увеличит счетчик только на единицу.
doza_and
Может так подойдет?
 from collections import Counter
class Tst:
    def __init__(self,m):
        self.m=m
s =[Tst(i) for i in [5,5,5,3,5,2]]
print(Counter(map(lambda x:x.m,s)))
Counter({5: 4, 3: 1, 2: 1})
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB