2017-02-26 4 views
-1

ファイルから3つのサブジェクトのマークを読み、各サブジェクトの最高マークを対応する名前で表示するプログラムを作成します。今まで私は最高のマークを得るためにプログラムを書くことができましたが、それに対応する名前を表示するためにそれを開発することはできませんでした。Python - テキストファイルからマークを読み取り、対応する名前で最高のマークを表示

とここに私のコードは次のとおりです。

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:お使いのファイル形式を考えるとマーク、名前

+0

サンプルテストファイルとそのフォーマットを表示するのに役立ちます。それは 'name、score1、score2、score3'ですか? – tdelaney

+0

いいえ出力は、各サブジェクトの最高のマークと対応する名前でなければなりません。 – Oshadhi

+0

私たち自身のテストファイルを書きたいのですか? – tdelaney

答えて

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 
0

もう一つの方法は、代わりにあなたのcode.here s1=s2=s3=[]内のリストのPythonの辞書を使用しています。

s1=s2=s3=[]は、すべてのリストが同じリストを指しているため、論理エラーです。したがって、3つのリストはすべて、リスト内の同じ値/要素を持ちます。ここ

と辞書の要素だけではなくint型 、

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

そうな値として被写体に対応するためのキーとして名(と仮定すると、名前がユニークである)とマークと各被験者について、その基本的辞書。 したがって、あなたのmymax関数で少し変更を加えなければなりません。 operator.itemgetterをインポートして、指定した列に基づいて辞書の最大値を見つけることができます。 Sorting dictionary

finding 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() 

だろう。

関連する問題