Python练习:计算每个学生的最低和最高分数。

时间:2016-12-28 11:14:55

标签: python python-3.x max min

这里的初学者总编程,需要你的指导。

我从一些免费的在线课程学习python,然后遇到这个特殊的练习,我已经解决了,但令我困惑的是,有两种不同的方式会产生不同的结果。所以这就是..

问题: 使用文本文件studentdata.txt(如下所示)编写一个程序,计算每个学生的最低和最高分数。打印出他们的名字。

  

studentdata.txt:
  乔10 15 20 30 40
  bill 23 16 19 22
  sue 8 22 17 14 32 17 24 21 2 9 11 17
  恩典12 28 21 45 26 10
  约翰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
  起诉:2最大:32
  恩典最小值:10最大值:45
  约翰敏:14最高: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()

哪个更简单,但它会产生稍微不同(但至关重要)的结果:

  

joe min:10 max:40
  bill min:16 max:23
  起诉:最多11:9   恩典最小值:10最大值:45
  约翰敏:14最高:89

请注意, sue 的结果不同。 &#39;自动&#39;版本没有产生正确的结果。这是怎么发生的?

感谢。

5 个答案:

答案 0 :(得分:3)

第二个版本的问题是它在比较之前不会将分数转换为int。在'32'之前比较字符串'9'

您可以在使用intmin之前将分数转换为max来解决问题:

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))

答案 1 :(得分:1)

网站上提供的答案会计算minmax帐户lexicographical order。其余的答案都匹配,这只是巧合。

答案 2 :(得分:1)

这可能是因为在找到'minimum'和'maximum'时,数字没有转换为整数类型,它们被视为字符串类型。您应该首先使用map函数或其他方式将其转换为您的方便。

我做到了这一点并且有效 -

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

答案 3 :(得分:0)

尝试将输入数据转换为整数,它应该可以工作。 Python有简单的&#34; int()&#34;您已在第一个版本中使用过的方法。问题是,然后比较字符串python使用字母顺序。例如:&#34; 100000000&#34;不到那么&#34; 2&#34;。但是int(&#34; 100000000&#34;)比int(&#34; 2&#34;)更能解决问题。

答案 4 :(得分:0)

第二个将它们作为字符串进行比较,字符串按字典顺序用字符串的第一个字符进行比较,例如&#39; 6&#39; &LT; &#39; 58&#39;这是假的,这个&#39; 8&#39; &GT; &#39; 234&#39;是真的。