2016-12-28 982 views
3

初學者到這裏編程,需要你的指導。Python練習:計算每個學生的最低和最高分數。

我從一些免費的在線課程學習python,然後遇到這個特定的練習,我已經解決了,但令我困惑的是,有兩種不同的方式產生不同的結果。所以在這裏不用..

問題: 使用文本文件studentdata.txt(如下圖所示)編寫計算每個學生的最低和最高分數的程序。打印出他們的名字。

studentdata.txt:
joe 10 15 20 30 40
bill 23 16 19 22
sue 8 22 17 14 32 17 24 21 2 9 11 17
grace 12 28 21 45 26 10
john 14 32 25 16 89

我的最後一次嘗試:

xFile = open("studentdata.txt", "r") 

for xLine in xFile: 
    xList = xLine.split() 
    min = 100 
    max = 0 

    for x in xList[1:]: 
     if int(x) > max: 
      max = int(x) 
    for x in xList[1:]: 
     if int(x) < min: 
      min = int(x) 

print(xList[0],"\tmin: ",min,"\tmax: ",max) 

xFile.close() 

結果:

joe min: 10 max: 40
bill min: 16 max: 23
sue min: 2 max: 32
grace min: 10 max: 45
john min: 14 max: 89

然後我將它比作由網站提供的給定答案(我把它改寫在我的風格):

xFile = open("studentdata.txt", "r") 

for xLine in xFile: 
    xList = xLine.split() 
    print(xList[0],"\tmin: ",min(xList[1:]),"\tmax: ",max(xList[1:])) 

xFile.close() 

哪個更簡單,bu t將其產生略微不同的(但重要)結果:

joe min: 10 max: 40
bill min: 16 max: 23
sue min: 11 max: 9
grace min: 10 max: 45
john min: 14 max: 89

注意,爲結果告是不同的。 '自動'版本不會產生正確的結果。這是怎麼發生的?

謝謝。

+1

的自動版本(因爲你創造它)並比較它們作爲字符串,價值觀,併爲字符串9比11「大」 - 納米秒之前@ niemmi回答了;-) – Dilettant

+0

這很清楚。謝謝!然而,我試圖修改最後的命令:print(xList [0],「\ tmin:」,min(int(xList [1:])),「\ tmax:」,max(int(xList [1:])) )),收到此錯誤:TypeError:int()參數必須是字符串或數字,而不是'list'..顯然最大/最小值不支持'list'模式。所以第一個(手動)答案是正確的。我怎樣才能簡化這個?謝謝 – NunNo

+1

啊不,你不能把一個字符串列表作爲int的參數賦予int,int列表是你在列表中讀取時必須做的;-)你可以使用min和最大INTS的名單上 - 樣本分鐘([INT(X)爲X中的Xlist [1:]) – Dilettant

回答

3

第二個版本的問題是它在比較之前不會將得分轉換爲int。當比較字符串'32'之前'9'

您可以通過使用minmax之前轉換分數int解決這個問題:

with open("studentdata.txt", "r") as xFile: 
    for xLine in xFile: 
     xList = xLine.split() 
     scores = [int(x) for x in xList[1:]] 
     print(xList[0],"\tmin: ",min(scores),"\tmax: ",max(scores)) 
+0

代碼看起來不錯,但我得到了「類型錯誤:一個是不確定的」 描述 類型錯誤最常發生的時候表達式試圖將兩個對象與不應該組合的類型組合起來。就像舉一個字符串的電源 – NunNo

+0

@NunNo你是如何運行它的?您是否將示例數據從問題中複製到'studentdata.txt'中,並且代碼完全按照從同一文件夾下的腳本的答案中複製的代碼? – niemmi

+0

我將它直接粘貼到站點中的活動代碼中。現在,我做了一些修改後,它的工作原理,謝謝! :) – NunNo

1

,其設置在網站上的答案計算minmax採取lexicographical order帳戶。其餘答案匹配只是一個巧合。

0

嘗試將輸入數據轉換爲整數,它應該工作。 Python對於你已經在第一個版本中使用過的簡單的「int()」方法。事情是,然後比較字符串python使用字母順序。例如:「100000000」小於「2」。但是int(「100000000」)多於int(「2」),這就解決了這個問題。

0

第二個將它們作爲字符串進行比較,字符串按字典順序與字符串的第一個字符進行比較,例如'6'<'58'這是False,並且這個'8'>'234'是True。

1

這可能是因爲在查找'最小'和'最大'時,數字不會被轉換爲整數類型,它們被視爲字符串類型。您應該首先使用map函數或其他函數根據您的方便進行轉換。

我做這個和它的實施─

print(xList[0],"\tmin: ",min(list(map(int, xList[1:]))),"\tmax: ",max(list(map(int, xList[1:]))))