Как рассчитать процент и среднее значение тестов в 2D-списке без использования таких библиотек, как pandas или numpy

У меня есть CSV-данные тестовых результатов. Текущая программа может считывать эти данные в 2D-список с тестом вне оценок. Позже я создал функцию для удаления теста из строки, чтобы отображались только оценки учащегося. Сейчас я пытаюсь написать функцию, которая может печатать баллы, чтобы процент каждого учащегося отображался в отдельной строке вывода.

Мой код до сих пор

def getData():

   with open("testscores.csv","r") as file:
    lineArray = file.read().splitlines()
    matrix = []
    for line in lineArray:
      matrix.append(line.split(","))

    return matrix

def fullScores(matrix):
  matrix.pop(0)

  return matrix

def printscores(matrix):

  for counter in matrix:
    for values in counter:
      print(values, end= " ")
    print()
  

matrix = getData()
matrix = fullScores(matrix)
print()
printscores(matrix)

вывод

Bob 10 9 7 8 10 9 9 9 10 8 8 10 9 9 
Sue 8 8 8 9 4 8 9 7 8 3 10 10 7 9
Jan 6 6 0 5 7 9 4 7 8 5 7 1 5 9
Sam 8 8 8 7 7 7 9 9 9 9 8 9 10 8
Tom 9 9 9 9 9 9 9 9 9 10 9 9 9 9

ожидаемый результат

Bob 100% 90% 70% 80% 100% 90% 90% 90% 100% 80% 80% 100% 90% 90% Average = 89%
Sue 80% 80% 80% 90% 40% 80% 90% 70% 80% 30% 100% 100% 70% 90% Average = 77%
...

CSV-данные

Testoutof,10,11,12,11,10,11,9,10,10,11,10,12,10,9
Bob,10,9,7,8,10,9,9,9,10,8,8,10,9,9
Sue,8,8,8,9,4,8,9,7,8,3,10,10,7,9
Jan,6,6,0,5,7,9,4,7,8,5,7,1,5,9
Sam,8,8,8,7,7,7,9,9,9,9,8,9,10,8
Tom,9,9,9,9,9,9,9,9,9,10,9,9,9,9

Почему вы просто отбрасываете первую строку? Это то, что говорит вам число, которое вы должны использовать для расчета процента для каждого столбца. Не похоже, что вы пытались вычислить процент и среднее значение. Пожалуйста, попробуйте сами, прежде чем спрашивать. Если вы уже предприняли попытку, у вас, вероятно, есть более конкретный вопрос, чем «как мне это сделать?», поэтому, пожалуйста, задайте этот вопрос.

Pranav Hosangadi 20.11.2022 22:02

Верно. Это было просто для того, чтобы не показывать пользователю оценки, но это нормально, мы можем оставить это. Любой намек или предложение, как рассчитать процент и среднее значение? Спасибо.

Mateo 20.11.2022 22:06
how to calculate percentage - разделите каждый балл на 10, затем умножьте на 100. how to calculate ... average? - суммируйте баллы и разделите на количество баллов.
wwii 20.11.2022 23:11
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
Python PyPDF2 - запись метаданных PDF
Python PyPDF2 - запись метаданных PDF
Python скрипт, который будет записывать метаданные в PDF файл, для этого мы будем использовать PDF ридер из библиотеки PyPDF2 . PyPDF2 - это...
Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
Почему Python - идеальный выбор для проекта AI и ML
Почему Python - идеальный выбор для проекта AI и ML
Блог, которым поделился Harikrishna Kundariya в нашем сообществе Developer Nation Community.
Как автоматически добавлять котировки в заголовки запросов с помощью PyCharm
Как автоматически добавлять котировки в заголовки запросов с помощью PyCharm
Как автоматически добавлять котировки в заголовки запросов с помощью PyCharm
Анализ продукта магазина на Tokopedia
Анализ продукта магазина на Tokopedia
Tokopedia - это место, где продавцы могут продавать свои товары. Товар должен быть размещен на витрине, чтобы покупателям было легче найти товар...
1
3
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

students = []
reference_scores = []

def get_data():
    with open("./data/testscores.csv", "r") as file:
        lineArray = file.read().splitlines()        

        for line in lineArray:
            raw_data = line.split(",")
            name = raw_data[0]
            scores = []
            percentages = []
            average_percentage = 0

            if name != 'Testoutof':
                scores = raw_data[1:]

                for index, score in enumerate(scores):
                    percentage = get_percentage(int(score), int(reference_scores[index]))
                    average_percentage += percentage
                    percentages.append(percentage)
                average_percentage //= len(scores)
                students.append( (name, percentages, average_percentage) )
            else:
                reference_scores = raw_data[1:]
    return students

def get_percentage(score, reference):
    return (score * 100) // reference

def print_scores(data):
    for obj in data:
        score_string = ''
        for score in obj[1]:
            score_string += f'{score}% '    
        print(f'{obj[0]} {score_string} Average = {obj[2]}')

students = get_data()
print_scores(students)

# Output
Bob 100% 81% 58% 72% 100% 81% 100% 90% 100% 72% 80% 83% 90% 100%  Average = 86
Sue 80% 72% 66% 81% 40% 72% 100% 70% 80% 27% 100% 83% 70% 100%  Average = 74
Jan 60% 54% 0% 45% 70% 81% 44% 70% 80% 45% 70% 8% 50% 100%  Average = 55    
Sam 80% 72% 66% 63% 70% 63% 100% 90% 90% 81% 80% 75% 100% 88%  Average = 79 
Tom 90% 81% 75% 81% 90% 81% 100% 90% 90% 90% 90% 75% 90% 100%  Average = 87
Ответ принят как подходящий

Использование list comprehension может дать вам тот же результат без какого-либо определения функции:

file=open("testscores.csv","r")
matrix=[line.strip().split(",") for line in file.readlines()[1:]]

for row in matrix:
  data=[int(i)*10 for i in row[1:]]
  print(row[0], "% ".join(map(str, data))+"%",  "Average =", sum(data)//len(data),"%")

Вывод:

Bob 100% 90% 70% 80% 100% 90% 90% 90% 100% 80% 80% 100% 90% 90% Average = 89 %
Sue 80% 80% 80% 90% 40% 80% 90% 70% 80% 30% 100% 100% 70% 90% Average = 77 %
Jan 60% 60% 0% 50% 70% 90% 40% 70% 80% 50% 70% 10% 50% 90% Average = 56 %
Sam 80% 80% 80% 70% 70% 70% 90% 90% 90% 90% 80% 90% 100% 80% Average = 82 %
Tom 90% 90% 90% 90% 90% 90% 90% 90% 90% 100% 90% 90% 90% 90% Average = 90 %

Другие вопросы по теме