Python-Read标记来自文本文件,并显示具有相应名称的最高标记

时间:2017-02-26 05:44:02

标签: python

我想编写一个程序,从文件中读取3个主题的标记,并显示每个主题的最高分,并带有相应的名称。到目前为止,我能够编写程序以获得最高分,但我无法开发它以显示相应的名称。

这是我的代码:

def mymax(m):
    m.sort()
    mx=m[-1]
    return mx
s1=s2=s3=[]
rfile=open("marks.txt","r")
record=rfile.readline()
while record!="":
     data=record.strip("\n").split(",")
     x=int(data[1])
     y=int(data[2])
     z=int(data[3])
     s1=s1+[x]
     s2=s2+[y]
     s3=s3+[z]
     record=rfile.readline()
print("Highest marks of subject 1:",mymax(s1))
print("Highest marks of subject 2:",mymax(s2))
print("Highest marks of subject 3:",mymax(s3))
rfile.close() 

我想要的输出是:
主题1的最高分:标记,名称
主题2的最高分:标记,名称
主题3的最高分:标记,名称

2 个答案:

答案 0 :(得分:0)

根据您的文件格式,您可以更轻松地使用csv模块:

import csv

with open('marks.txt') as f:
    subjects = 1, 2, 3  # specify subject columns
    reader = csv.reader(f)
    rows = list(reader)  # e.g. row: ['name_x', '3', '4', '5']
    # for each subject, zip the grades with their corresponding name
    named_grades = [[(int(r[i]), r[0]) for r in rows] for i in subjects]
    for i, s in enumerate(subjects):
        # feed max the (grade, name) pairs for each subject
        print("Highest marks of subject {}: {}, {}".format(s, *max(named_grades[i])))

对于像

这样的文件
name1,2,7,1
name2,1,3,4
name3,6,6,2
name4,5,3,4
name5,3,2,5
name6,2,3,4

输出将是:

Highest marks of subject 1: 6, name3
Highest marks of subject 2: 7, name1
Highest marks of subject 3: 5, name5

答案 1 :(得分:0)

另一种方法是使用python词典而不是代码中的列表。s1=s2=s3=[]

s1=s2=s3=[]是一个逻辑错误,因为所有列表都指向同一个列表。因此,所有3个列表的列表中都有相同的值/元素。

字典元素而不仅仅是一个int ,这里

x=int(data[1])
y=int(data[2])
z=int(data[3])

因此它基本上是每个主题的字典,其名称为键(假设名称是唯一的),并将相应主题标记为值。 因此,必须在mymax函数中进行小的更改。您可以导入operator.itemgetter以根据指定的列找到字典的最大值。Sorting dictionaryfinding Max value in a dictionary

因此,修改后的代码将是

import operator
def mymax(m):
    sorted_m = sorted(m.items(), key=operator.itemgetter(1))
    return sorted_m[-1]
s1={}
s2={}
s3={}
rfile=open("marks.txt","r")
record=rfile.readline()
while record!="":
     data=record.strip("\n").split(",")
     '''x=int(data[1])
     y=int(data[2])
     z=int(data[3])''' #not needed
     s1[data[0]]=int(data[1])
     s2[data[0]]=int(data[2])
     s3[data[0]]=int(data[3])
     record=rfile.readline()
print("Highest marks of subject 1:",mymax(s1))
print("Highest marks of subject 2:",mymax(s2))
print("Highest marks of subject 3:",mymax(s3))
rfile.close()

根据您的格式修改您希望打印值的方式。