2015-12-11 147 views
2

我的代碼存在問題,我試圖找到一種方法將分數從最高到最低。最高到最低

但是每當我做了一堆數字或它說的對象。

我想從存儲文本文件的地方得到分數。我的代碼的其餘部分沒有問題,除了這部分。

我嘗試了很多方法,直到我沒有意識到我在做什麼。

with open('class1.txt', 'r') as f: 
    for f in sorted(f): 
     name, *scores = f.split(',') 
     hl = list(reversed(scores)) 
     print (hl) 

我的文本文件看起來像這樣:

nathan ,2, 0, 10 
adil ,8, 9, 7 
masuda ,7, 4, 6 
zain ,0, 0, 3 
abdur rauf ,2, 0, 0 
danniel ,7, 7, 2 

這是我所得到的,當我運行我的代碼:

> [' 0\n', ' 0', '2'] 
[' 7\n', ' 9', '8'] 
[' 2\n', ' 7', '7'] 
[' 6\n', ' 4', '7'] 
[' 10\n', ' 0', '2'] 
[' 3\n', ' 0', '0'] 

時候,確實應該是這樣的

adil ,9, 8, 7 
abdur rauf ,2, 0, 0 
danniel ,7, 7, 2 
masuda ,7, 6, 4 
nathan ,10, 2, 0 
zain ,3, 0, 0 
+0

你不應該爲類號和順序號使用相同的'clas'變量g選擇。 – Barmar

+0

當測試互相排斥時,您還應該使用'else if'。 – Barmar

+0

你的'hl'選擇在哪裏按他們的分數排序學生?它使用與'按字母排序'相同的'排序(f)'。 – Barmar

回答

2
  1. sorted(f)給你的東西,如:

    ['abdur rauf ,2, 0, 0 \n', 
    'adil ,8, 9, 7 \n', 
    'danniel ,7, 7, 2\n', 
    'masuda ,7, 4, 6 \n', 
    'nathan ,2, 0, 10 \n', 
    'zain ,0, 0, 3 \n'] 
    

    注意,有一些\n,這意味着新的生產線。

    解決方案:

    Simpely使用str.splitlines(),如:

    for f in sorted(f.read().splitlines()) 
    
  2. f.split(',')給你(修復程序\n發行後):

    ['abdur rauf ,2, 0, 0 ', 
    'adil ,8, 9, 7 ', 
    'danniel ,7, 7, 2', 
    'masuda ,7, 4, 6', 
    'nathan ,2, 0, 10 ', 
    'zain ,0, 0, 3 '] 
    

    這並不工作,因爲有,後面有一些空格。線路末端還有另一個空間。

    解決方案:

    使用re.split('\s*,\s*', f),除去在該行的末尾的另一個空間,你可以使用str.strip()這樣的:

    >>> for f in sorted(f.read().splitlines()): 
    ...  re.split('\s*,\s*', f.strip()) 
    ...  
    ... 
    ['abdur rauf', '2', '0', '0'] 
    ['adil', '8', '9', '7'] 
    ['danniel', '7', '7', '2'] 
    ['masuda', '7', '4', '6'] 
    ['nathan', '2', '0', '10'] 
    ['zain', '0', '0', '3'] 
    
  3. list(reversed(scores))只能扭轉scores列表。你應該再次使用sorted()

    但是因爲在str對象上使用sorted(如'2','3')會給你輸出錯誤。例如'10' < '2'True。將它們隱藏到int對象使用map(int, scores)

    您還需要最高到最低。然後,你可以啓用reverse選項sorted通過:

    hl = sorted(map(int, scores), reverse=True) 
    

    Here's another question on SO什麼是reversedsorted(list, reverse=True)

  4. print(hl)之間的差異只列出打印。在這種情況下,我認爲你需要加入他們使用' ,'.join([name]+scores)

    print(' ,'.join([name]+list(map(str, hl)))) # covert `hl` elements to str objects again since we need use `str.join` 
    

所以完整的代碼如下所示:

import re 

with open('class1.txt', 'r') as f: 
    for f in sorted(f.read().splitlines()): 
     name, *scores = re.split('\s*,\s*', f.strip()) 
     hl = sorted(map(int, scores), reverse=True) 
     print(' ,'.join([name]+list(map(str, hl)))) 

輸出將是:

abdur rauf ,2 ,0 ,0 
adil ,9 ,8 ,7 
danniel ,7 ,7 ,2 
masuda ,7 ,6 ,4 
nathan ,10 ,2 ,0 
zain ,3 ,0 ,0 
+0

非常感謝你! ;) – shahid

+0

@Nahid:如果你認爲答案有幫助,請記住接受它。檢查我們的[旅遊]更多細節;) –

+0

遺憾,但真的想知道你是怎麼擅長編碼,這樣的話,我能得到一個好太 – shahid