2015-04-23 34 views
2

我有一個文件,其中有一組人的分數。每個人有3分。我只能顯示該人的最高分數。但是,我無法打印到python shell,最高得分按降序排列。例如:將文件中的列從高到低排序

Persona 12 
Personb 14 
Personc 17 
Persond 11 

而我希望它按照得分的降序排序。因此,它應該是這樣的:

personc 17 
personb 14 
persona 12 
persond 11 

到目前爲止,我已經創造了這個代碼,但是我不知道如何繼續:

with open("class.txt","r") as file: 
 
     lines = file.readlines() 
 
    with open('class.txt','w') as fileout: 
 
     for line in lines: 
 
      fields = line.split() 
 
      name, grades = fields[0], fields[1:] 
 
      grades = [int(grade) for grade in grades] 
 
      grades.sort() 
 
      highest = str(max(grades)) 
 
      grades = [str(highest) for grade in grades] 
 
      rows = filter(None, [line.strip().split() for line in open("file.txt", "r")]) 
 
      data = [(name, int(highest)) for name, highest in rows] 
 
     for name, highest in sorted(data, key=itemgetter(1)): 
 
      print("{0:s} {1:d}".format(person, score))

回答

3

這很簡單,只要:

from operator import itemgetter 


rows = filter(None, [line.strip().split() for line in open("data", "r")]) 
data = [(person, int(score)) for person, score in rows] 

for person, score in sorted(data, key=itemgetter(1), reverse=True): 
    print "{0:s} {1:d}".format(person, score) 

注:假設您的輸入數據是無效的錯誤數據和一般垃圾。如果你的輸入數據是不是乾淨,你將不得不進一步擴大這個!

輸出:

$ python test_data.py 
Personc 17 
Personb 14 
Persona 12 
Persond 11 

更新:

如果你的數據有垃圾它就像你在您的評論形容。

$ cat data 
Persona 12 foo 
Personb 14 bar 
Personc 17 baz 
Persond 11 

接着上面的程序就必須例如使用自定義key略作修改:

def sortkey(row): 
    return int(row[1]) 


rows = filter(None, [line.strip().split() for line in open("data", "r")]) 

for row in sorted(rows, key=sortkey, reverse=True): 
    print "{0:s} {1:s}".format(row[0], row[1]) 

這仍然會產生格蘭相同的輸出:

$ python test_data.py 
Personc 17 
Personb 14 
Persona 12 
Persond 11 
+0

Theres發生在數據行上的一個錯誤,它說ValueError:太多的值來解壓(預計2) – user3350669

+0

我沒有提醒你數據的假設**乾淨**和**確切* *! –

+0

哦,我解決了這個問題,但它仍然沒有按降序排列。我已經更新了代碼,以便您可以看到哪裏出錯了 – user3350669

1

要添加到詹姆斯的真棒的答案,你可以添加一個「清理」功能,只抓住前兩項,結帳take3()

from operator import itemgetter 

def take3(a, b, *rest): return a, b, rest 

rows = filter(None, (line.strip().split() for line in open("data", "r"))) 

data = [] 
for row in rows: 
    person, score, _ = take3(*row) 
    data.append([person, int(score)]) 

for person, score in sorted(data, key=itemgetter(1), reverse=True): 
    print "{0:s} {1:d}".format(person, score)