Python 3, использующий оператор if для чтения значений в 1 массиве и добавления другого значения в другой массив - PullRequest
0 голосов
/ 07 мая 2018

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

Код, похоже, читает массив (в процентах), но не сохраняет правильное значение в массиве (класс). Я не могу найти ответ, который решает проблему. Вот мой код

percent = [33, 44, 55, 66, 77, 88, 99]
grade = []

for i in range(0, len(percent)):
    if i >= 70 and i <= 100:
        grade.append("Grade A")
    elif i >= 60 and i <= 69:
        grade.append("Grade B")
    elif i >= 50 and i <= 59:
        grade.append("Grade C")
    elif i >= 45 and i <= 49:
        grade.append("Grade D")
    else:
        grade.append("No grade achieved")

print(grade)

Все, что выводится на печать, это «Оценка не достигнута», даже если значения не соответствуют этому. Что я тут не так делаю?

Ответы [ 6 ]

0 голосов
/ 07 мая 2018

Хотя другие авторы предоставили правильные ответы, я хотел бы воспользоваться моментом и познакомить вас с другим подходом, который будет «лучше». В общем, при программировании более «если / если еще» у вас есть, экспоненциально сложная логика. Если у вас есть 1 «если», то есть две ветви. 1 если + 1, 4 ветви и т. Д. Так что в общем случае рекомендуется минимизировать количество ветвлений. Вы можете изменить ситуацию, чтобы использовать справочную таблицу, которая имеет несколько преимуществ:

  1. Может быть загружено из внешней таблицы (База данных).
  2. Минимальное изменение кода, если вы хотите добавить, удалить или изменить элементы в таблице.
  3. Та же логика применяется для каждого, сокращая особые случаи, но делая особые случаи гораздо более очевидными.

Пример:

grade_scale = {45: 'Grade D', 50: 'Grade C', 60: 'Grade B', 70: 'Grade A', 0:'No grade achieved'}
student_percents = [33, 44, 55, 66, 77, 88, 99]
letter_grades = []
for student_percent in student_percents:
    for percent_grade in sorted(grade_scale.keys(), reverse=True)): #sorted makes sure the table is read int he right order, regardless of key order (0 comes after 70 in the example), but python will sort keys in ascending order anyway for some datatypes. 
            if (student_percent >= percent_grade)
                letter_grades.append(grade_scale[percent_grade])
                break
0 голосов
/ 07 мая 2018

Когда вы пишете for i in range(0, len(percent)):, вы перебираете индексы (подсказка: i обозначает индекс) списка (так мы их называем в python, а не массивы, так как они работают иначе, чем то, что, например, в C (++) вызывает массивы).

Итак, когда вы проверяете значение i, вы не проверяете 33, затем 44, затем 55 и т. Д., Вы проверяете 0, затем 1, затем 2 ...

Есть два способа получить правильное значение.

  1. Используйте индекс, чтобы просмотреть список:

    if percent[i] >= 70:

  2. Вместо того, чтобы перебирать индексы списка, перебирайте элементы списка:

    for x in percent:

0 голосов
/ 07 мая 2018

Вы неправильно понимаете значения массива с его индексом. Я даю вам индекс каждого элемента массива, а не фактическое значение. Измените каждое условие как

percent = [33, 44, 55, 66, 77, 88, 99]
grade = []

for i in range(0, len(percent)):
    if percent[i] >= 70 and i <= 100:
        grade.append("Grade A")
    elif percent[i] >= 60 and i <= 69:
        grade.append("Grade B")
    elif percent[i] >= 50 and i <= 59:
        grade.append("Grade C")
    elif percent[i] >= 45 and i <= 49:
        grade.append("Grade D")
    else:
        grade.append("No grade achieved")

print(grade)
0 голосов
/ 07 мая 2018

Вы сравниваете i, ваш счетчик циклов с вашим валидатором оценок.

Вы хотите, чтобы счетчик циклов сообщал, какой элемент массива вызывать.Так что, если i = 0 в одном случае, он смотрит, если 0 больше 70 и меньше 100. Если i = 5, и вы вызываете процентов [i], вы получаете шестое значение в массиве процентов88.

percent = [33, 44, 55, 66, 77, 88, 99]
grade = []

for i in range(0, len(percent)):
    if percent[i] >= 70 and percent[i] <= 100:
        grade.append("Grade A")
    elif percent[i] >= 60 and percent[i] <= 69:
        grade.append("Grade B")
    elif percent[i] >= 50 and percent[i] <= 59:
        grade.append("Grade C")
    elif percent[i] >= 45 and percent[i] <= 49:
        grade.append("Grade D")
    else:
        grade.append("No grade achieved")

print(grade)
0 голосов
/ 07 мая 2018

Проблема здесь в том, что значение i является индексом вашего цикла, а не значением percent. Учтите это изменение:

percent = [33, 44, 55, 66, 77, 88, 99]
grade = []

for i in percent:
    if i >= 70 and i <= 100:
        grade.append("Grade A")
    elif i >= 60 and i <= 69:
        grade.append("Grade B")
    elif i >= 50 and i <= 59:
        grade.append("Grade C")
    elif i >= 45 and i <= 49:
        grade.append("Grade D")
    else:
        grade.append("No grade achieved")

print(grade)

Несколько заметок:

  1. Вы можете проверить значение i с помощью отладчика или напечатав i в цикле.
  2. Вместо этого вы можете оставить определение цикла таким же (for i in range(0, len(percent))) и проверить значение процентов percent[i] в ваших операторах if / else.
0 голосов
/ 07 мая 2018
percent = [33, 44, 55, 66, 77, 88, 99]
grade = []

for i in range(0, len(percent)):
    if percent[i] >= 70 and percent[i] <= 100:
        grade.append("Grade A")
    elif percent[i] >= 60 and percent[i] <= 69:
        grade.append("Grade B")
    elif percent[i] >= 50 and percent[i] <= 59:
        grade.append("Grade C")
    elif percent[i] >= 45 and percent[i] <= 49:
        grade.append("Grade D")
    else:
        grade.append("No grade achieved")

print(grade)

Вы сравнивали значения с индексом i, а не с процентным элементом в индексе i. Итак, вы шли против значений 0,1,2,3 и т. Д.

Приведенный выше код работает как задумано

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...