2016-12-28 981 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:]))))