2017-08-24 30 views
0

我正在製作一個程序,它讀取文件內容並顯示模塊代碼,學號,學生姓名和最終標記從最高到最低。到目前爲止,我已經通過快速排序對最終標記進行了排序。Python如何根據最高到最低排序文件中的學生最後標記的每一行

這是我的文件的內容,77.5是17.5,20.0,20.0,20.0,20.0和最終成績,隨後被其他

DICT 201707011 Johnny_Guy 77.5 17.5 20.0 20.0 20.0 
DICT 201707012 Jenny_Girl 70.0 17.5 17.5 17.5 17.5 
DICT 201707013 Joshua_Tan 79.5 17.5 22.0 20.0 20.0 
DICT 201707014 Jamine_Butters 67.5 17.5 10.0 20.0 20.0 
DICT 201707015 Jone_Davy 97.5 17.5 30.0 30.0 20.0 

這是我的代碼

from pathlib import Path 
home = str(Path.home()) 
stdData = [] # store module code, student number and name 
markData = [] # store the final mark of each student 

def qsort(myList): 
    if not myList: 
     return [] 
    else: 
     pivot = myList[0] 
     remainingList = myList[1:] 
     lessOrEqual = [ y for y in remainingList if y <= pivot ] 
     greater = [ y for y in remainingList if y > pivot ] 
     return qsort(greater) + [pivot] + qsort(lessOrEqual) 

def sortedMark(): 
    with open(home + "\\Desktop\\PADS Assignment\\test(sorted).txt", "a") as f: 
     with open(home + "\\Desktop\\PADS Assignment\\test(unsorted).txt", "r") as f1: 
      lines = [line.split() for line in f1] # convert each line in file into 2d array 
      print(lines) 
      for a in lines: 
       moduleCode = a[0] # DICT is the module code 
       stdNum = a[1] # 201707011 and so on is the student number 
       stdName = a[2] # Jonny_Guy and so on is the student name 
       finalMark = a[3] # 77.5 and 70.0 and so on is the final mark 
       markData.append(finalMark) # append final mark of lines in each line into an array 
       stdData.append(moduleCode) 
       stdData.append(stdNum) 
       stdData.append(stdName) 
       finalSortMark = qsort(markData) 
      print(finalSortMark) 


sortedMark() 

這是我的輸出,所述第一輸出是文件和所述第二輸出的2D陣列是學生的快速排序與排序最終標記

[['DICT', '201707011', 'Johnny_Guy', '77.5', '17.5', '20.0', '20.0', '20.0'], ['DICT', '201707012', 'Jenny_Girl', '70.0', '17.5', '17.5', '17.5', '17.5'], ['DICT', '201707013', 'Joshua_Tan', '79.5', '17.5', '22.0', '20.0', '20.0'], ['DICT', '201707014', 'Jamine_Butters', '67.5', '17.5', '10.0', '20.0', '20.0'], ['DICT', '201707015', 'Jone_Davy', '97.5', '17.5', '30.0', '30.0', '20.0']] 
['97.5', '79.5', '77.5', '70.0', '67.5'] 

現在的問題是,我如何將模塊代碼,學號,學生姓名,最終標記從最高到最低排序到像這樣的輸出文件中?

DICT 201707015 Jone_Davy 97.5 17.5 30.0 30.0 20.0 
DICT 201707013 Joshua_Tan 79.5 17.5 22.0 20.0 20.0 
DICT 201707011 Johnny_Guy 77.5 17.5 20.0 20.0 20.0 
DICT 201707012 Jenny_Girl 70.0 17.5 17.5 17.5 17.5 
DICT 201707014 Jamine_Butters 67.5 17.5 10.0 20.0 20.0 
+0

你意識到你覆蓋已保留字'sorted'? – Mangohero1

+0

在你的例子中,最後的分數從最低到最高排序,但你要求從最高分到最低分。你是指哪一個? – Antimony

+0

ops,讓我編輯問題 –

回答

0

看起來你做最後的標記(只)

markData.append(finalMark) # append final mark of lines in each line into an array 

然後排序該列表

​​列表

你應該排序的所有行

[['DICT', '201707011', 'Johnny_Guy', '77.5', '17.5', '20.0', '20.0', '20.0'], 
['DICT', '201707012', 'Jenny_Girl', '70.0', '17.5', '17.5', '17.5', '17.5'], 
['DICT', '201707013', 'Joshua_Tan', '79.5', '17.5', '22.0', '20.0', '20.0'], 
['DICT', '201707014', 'Jamine_Butters', '67.5', '17.5', '10.0', '20.0', '20.0'], 
['DICT', '201707015', 'Jone_Davy', '97.5', '17.5', '30.0', '30.0', '20.0']] 

on第4列(行[3])

您需要編寫qsort,以便它除了所有行之外,然後將它們排序在第4列上。要做到這一點,對於每一行你需要提取第四列的值並使用它來確定一行是否大於或小於另一行。當你遞歸的時候,你需要通過整行(s)...在qsort,greaterlessOrEqual應該都是列表的列表。

+0

我該怎麼做?我只是一個新手python –

0

一種方法是推廣你的qsort函數來獲取第二個參數,一個比較函數。該函數接受兩個參數,如果第一個參數小於或等於第二個參數,則返回True。

這是一個這樣的函數,它假設它的兩個參數是列表。它比較列表中的元素#3並忽略其他元素。就你而言,元素#3包含最終得分。所以這就是你想要的。

def compare_marks(mark1, mark2): 
    return mark1[3] <= mark2[3] 

現在你的qsort函數會這個樣子,用比較函數的調用替換您的明確< =對比:

def qsort(myList, f_compare): 
    if not myList: 
     return [] 
    else: 
     pivot = myList[0] 
     remainingList = myList[1:] 
     lessOrEqual = [ y for y in remainingList if f_compare(y, pivot)] 
     greater = [ y for y in remainingList if not f_compare(y, pivot)] 
     return qsort(greater) + [pivot] + qsort(lessOrEqual) 

最後,在將數據收集到一個大名單的代碼進行排序,你把每一個分割線到列表中只是一個元素的它,而不是:

def sortedMark(): 
    with open(home + "\\Desktop\\PADS Assignment\\test(sorted).txt", "a") as f: 
     with open(home + "\\Desktop\\PADS Assignment\\test(unsorted).txt", "r") as f1: 
      lines = [line.split() for line in f1] # convert each line in file into 2d array 
      print(lines) 
      for a in lines: 
       moduleCode = a[0] # DICT is the module code 
       stdNum = a[1] # 201707011 and so on is the student number 
       stdName = a[2] # Jonny_Guy and so on is the student name 
       finalMark = a[3] # 77.5 and 70.0 and so on is the final mark 
       markData.append(a) # append split line to array 
       stdData.append(moduleCode) 
       stdData.append(stdNum) 
       stdData.append(stdName) 
       finalSortMark = qsort(markData) 
      print(finalSortMark) 

現在,在這一切結束時,每個元素在列表中finalSortMark包含最初存在於文件中的所有字段。您可以打印它或將其寫入文件,只要您認爲合適。

我不認爲你需要的名單stdData更多,但我把它留在那裏,所以你可以更容易地發現我所做的更改。

+1

而不是'qsort'中的兩個列表解析,爲什麼不只是:'for myList in myList [1:]:if something> pivot:greater.append(thing)... else:lessOrEqual.append (東西)' – wwii

+0

這將是更好的國際海事組織,但我試圖儘可能少地修改OP的原始代碼。 –

0

我做了一件很簡單的事情。

x = """DICT 201707011 Johnny_Guy 77.5 17.5 20.0 20.0 20.0 
DICT 201707012 Jenny_Girl 70.0 17.5 17.5 17.5 17.5 
DICT 201707013 Joshua_Tan 79.5 17.5 22.0 20.0 20.0 
DICT 201707014 Jamine_Butters 67.5 17.5 10.0 20.0 20.0 
DICT 201707015 Jone_Davy 97.5 17.5 30.0 30.0 20.0""" 

l = [] 
x = x.split("\n") 
for n in x: 
    n = n.split() 
    l.append(n[3] + " " + " ".join(n)) 
    l.reverse() 

l2 = [] 
for line in l: 
    line = line.split() 
    line.pop(0) 
    l2.append(" ".join(line)) 

for line2 in l2: 
    print(line2) 

輸出

DICT 201707015 Jone_Davy 97.5 17.5 30.0 30.0 20.0 
DICT 201707013 Joshua_Tan 79.5 17.5 22.0 20.0 20.0 
DICT 201707011 Johnny_Guy 77.5 17.5 20.0 20.0 20.0 
DICT 201707012 Jenny_Girl 70.0 17.5 17.5 17.5 17.5 
DICT 201707014 Jamine_Butters 67.5 17.5 10.0 20.0 20.0 
相關問題