Как загрузить расчетный ввод из текстового файла с помощью Python? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть текстовый файл, содержащий:

Number Name subject1 subject2 subject3 subject4 subject5
1234567 Jan 5 7 0 6 4
3526435 Marie 5 5 7 0 0
2230431 Kees 6 10 0 8 6
7685433 André 4 7 8 7 5
0364678 Antoinette 0 2 8 8 8
1424354 Jerôme 7 9 0 5 0
4536576 Kamal 8 0 8 7 8
1256033 Diana 0 0 0 0 0
5504657 Petra 6 6 7 0 6
9676575 Malika 0 6 0 0 8
0253756 Samira 3 8 6 7 10

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

В своем собственном коде я скопировал всю информацию и поместил ее в списки.

Проблема, с которой я сталкиваюсь, заключается в том, что мне нужна программа Python для чтения текстового файла и вычисления с заданными числами.

Пока это все, что у меня есть:

i = 0
file = open("resultaten.txt", "r")

for x in file:
    if i == 0:
        print("Lines: ")

    else:
        x = x.split()
        print(i, x)
    i +=1

Как использовать текстовый файл для вычисления конкретных символов в строке?

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Вы можете индексировать свою функцию x.split(), я бы не стал переписывать x.

y = x.split() Number = y[0] Name = y[1] ...

Или

Number, Name, subject1, subject2, subject3, subject4, subject5 = x.split()

Затем вы можете вычислить среднее.Вы можете попробовать что-то вроде ...

    Number, Name, subject1, subject2, subject3, subject4, subject5 = x.split()
    subjects = [float(subject1), float(subject2), float(subject3), float(subject4), float(subject5)]
    sum = 0
    zero_count = 0
    for subject in subjects:
       sum += subject
       if subject is 0:
          zero_count += 1
    # this will print the mean
    print(i,  sum/(len(subjects)-zero_count)

Этот блок кода может заменить то, что содержится в вашем выражении else, и он выведет индекс и среднее значение исключенными оценками '0'.

0 голосов
/ 09 октября 2018

Если мы преобразуем это в словарь, у нас будет большая гибкость в том, что мы хотим сделать с информацией.Это можно сделать с небольшими усилиями.Мы можем использовать первую строку для создания нашего keys, затем мы можем сжать эти ключи друг с другом, а затем создать список кортежей, сжав эти списки.Оттуда мы можем использовать конструктор словаря для создания нашего списка словарей.Теперь нам просто нужно собрать все keys из этого списка словарей, которые subjects для каждого элемента в списке, сопоставить их с целочисленными значениями и создать исключение для случая, когда студент набрал все 0 с.Если нет, мы отфильтровываем 0 из полного списка, а затем вычисляем среднее.Далее, чтобы получить средние значения для каждого subject, мы можем извлечь все значения, которые связаны с этим предметом, не принимая значения, которые являются 0, то же самое мы отображаем ints, а затем вычисляем среднее значение.Я добавил текстовое обоснование для появления, не обязательно.Процесс для оставшихся предметов будет таким же, просто поменять тему.

with open('text.txt') as f:
    content = [line.split() for line in f]

keys = content[0]

lst = list(zip([keys]*(len(content)-1), content[1:]))
x = [zip(i[0], i[1]) for i in lst]
z = [dict(i) for i in x]

print('Average Grades'.center(30))
for i in z:
    subs =[i['subject1'], i['subject2'], i['subject3'], i['subject4'], i['subject5']]
    subs = list(map(int, subs))
    if sum(subs) == 0:
        print('{:<10} average grade: {:>4}'.format(i['Name'], 0))
    else:
        subs = list(filter(lambda x: x >0, subs))
        avg = round(sum(subs)/len(subs), 2)
        print('{:<10} average grade: {:>4}'.format(i['Name'], avg))

sub1 = [i['subject1'] for i in z if i['subject1'] != '0']
sub1 = list(map(int, sub1))
sub1_avg = sum(sub1)/len(sub1)
print('\nAverage Grade for Subject 1: {}'.format(sub1_avg))
        Average Grades        
Jan        average grade:  5.5
Marie      average grade: 5.67
Kees       average grade:  7.5
André      average grade:  6.2
Antoinette average grade:  6.5
Jerôme     average grade:  7.0
Kamal      average grade: 7.75
Diana      average grade:    0
Petra      average grade: 6.25
Malika     average grade:  7.0
Samira     average grade:  6.8

Average Grade for Subject 1: 5.5
0 голосов
/ 09 октября 2018

Эти виды операций проще выполнять с библиотекой, предназначенной для работы с табличными данными, такими как ваша. Pandas является отличным примером, хотя это может быть немного сложным, особенно для тех, кто не имеет большого опыта работы с Python.В любом случае, вот один способ достичь того, чего (я думаю) вы хотите, используя панд.Исключение нулевых значений делает его немного более сложным, поэтому загадочный код:

# -*- coding: utf-8 -*-
# ^This line makes sure python is able to read some weird
# accented characters.

# Importing variaous libraries
import sys
import pandas as pd
import numpy as np

# Depending on your version of python, we need to import
# a different library for reading your input data as a
# string. This step is not required, you should probably
# use the pandas function called read_csv(), if you have
# your file stored locally.
if sys.version_info[0] < 3:
    from StringIO import StringIO
else:
    from io import StringIO

input_data = StringIO("""Number Name subject1 subject2 subject3 subject4 subject5
1234567 Jan 5 7 0 6 4
3526435 Marie 5 5 7 0 0
2230431 Kees 6 10 0 8 6
7685433 André 4 7 8 7 5
0364678 Antoinette 0 2 8 8 8
1424354 Jerôme 7 9 0 5 0
4536576 Kamal 8 0 8 7 8
1256033 Diana 0 0 0 0 0
5504657 Petra 6 6 7 0 6
9676575 Malika 0 6 0 0 8
0253756 Samira 3 8 6 7 10
""")

# Read data, specify that columns are delimited by space,
# using the sep= argument.
df = pd.read_csv(input_data, sep=" ")

# Find all column names contain subject scores, based on their name
# We just pick all columns that starts with the string "subject".
subject_columns = [c for c in df.columns if c.startswith("subject")]
print subject_columns

# Calculate mean score for each subject by finding the sum of all scores
# for each subject, then divide it by the number of data points for each
# subject that does not equal (or is greater than) 0.
for subject in subject_columns:
    df["%s_mean" % subject] = float(df[subject].sum()) / float(len(df[subject].loc[df[subject] > 0]))

# Calculate mean for each student, without 0s
# The .replace(0, np.NaN).count(axis=1) is just a trick to find the
# number of non-zero values in each row. In short, it replaces all
# values that are 0 with NaN, so that the count() function ignores
# those values when calculating the number of data points that are
# present in the dataset. I.e. it disregards values that are 0,
# so that they're excluded from the mean calculation.
df["student_mean"] = df[subject_columns].sum(axis=1) / df[subject_columns].replace(0, np.NaN).count(axis=1)

# This just configures pandas to print all columns in our dataset,
# and not truncate the print-out to fit to the screen.
pd.set_option("display.max_columns", 1000)

# Print out our final dataframe.
print df

Окончательный набор данных выглядит следующим образом:

     Number        Name  subject1  subject2  subject3  subject4  subject5  subject1_mean  subject2_mean  subject3_mean  subject4_mean  subject5_mean  student_mean
0   1234567         Jan         5         7         0         6         4            5.5       6.666667       7.333333       6.857143          6.875      5.500000
1   3526435       Marie         5         5         7         0         0            5.5       6.666667       7.333333       6.857143          6.875      5.666667
2   2230431        Kees         6        10         0         8         6            5.5       6.666667       7.333333       6.857143          6.875      7.500000
3   7685433       André         4         7         8         7         5            5.5       6.666667       7.333333       6.857143          6.875      6.200000
4    364678  Antoinette         0         2         8         8         8            5.5       6.666667       7.333333       6.857143          6.875      6.500000
5   1424354      Jerôme         7         9         0         5         0            5.5       6.666667       7.333333       6.857143          6.875      7.000000
6   4536576       Kamal         8         0         8         7         8            5.5       6.666667       7.333333       6.857143          6.875      7.750000
7   1256033       Diana         0         0         0         0         0            5.5       6.666667       7.333333       6.857143          6.875           NaN
8   5504657       Petra         6         6         7         0         6            5.5       6.666667       7.333333       6.857143          6.875      6.250000
9   9676575      Malika         0         6         0         0         8            5.5       6.666667       7.333333       6.857143          6.875      7.000000
10   253756      Samira         3         8         6         7        10            5.5       6.666667       7.333333       6.857143          6.875      6.800000

Обратите внимание, что вам нужно установить пандМодуль для этого на работу.Вам также понадобится модуль numpy .

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