2016-12-28 2 views
3

초보자가 여기 프로그래밍하는 데 귀하의지도가 필요합니다.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() 

어느 것이 더 간단합니까? 그것은 약간 다른 (그러나 중요한) 결과를 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

자동 버전을 worked-, 문자열 9는 11보다 "더 큰"있는 그대로 - 나노 초 이전 @ niemmi 대답 ;-) – Dilettant

+0

그것은 분명하다. 감사! 그러나 마지막 명령을 수정하려고했습니다 : print (xList [0], "\ tmin :", min (int (xList [1 :])), "\ tmax :", max (int (xList [1 :]))),이 오류가 발생했습니다 : TypeError : int() 인수는 'list'가 아닌 문자열 또는 숫자 여야합니다. 분명히 max/min은 'list'모드를 지원하지 않습니다. 따라서 첫 번째 (수동) 대답이 올바른 것입니다. 어떻게 이것을 단순화 할 수 있습니까? 감사합니다 – NunNo

+1

아, 아니, int() 메서드에 인수로 지정하여 int로 문자열 목록을 캐스팅 할 수 없습니다. int 캐스트는 목록에서 읽을 때 수행해야하는 작업입니다 .--) min 및 (x : xList [1 :]]의 x에 대한 int (x)) – 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

코드가 멋지지만 "TypeError : a가 정의되지 않았습니다." 설명 유형 오류는 다음과 같은 경우에 가장 자주 발생합니다. 표현식은 두 개의 객체를 결합해서는 안되는 유형과 결합하려고 시도합니다. 문자열을 힘으로 올리는 것 – NunNo

+0

@ NunNo 어떻게 실행 했습니까? 예제 데이터를 질문에서 'studentdata.txt'로 복사하고 코드를 동일한 폴더의 스크립트에 대한 응답에서와 똑같이 복사 했습니까? – niemmi

+0

사이트의 활성 코드에 직접 붙여 넣었습니다. 이제 약간의 수정을 한 후에 작동합니다. 감사합니다! :) – NunNo

1

사이트에서 제공되는 대답은 minmax 계정에 lexicographical order을 복용 계산합니다. 나머지 답변이 일치하는 것은 단지 우연의 일치입니다.

0

입력 데이터를 정수로 변환 해보십시오. 제대로 작동해야합니다. 파이썬에는 이미 첫 번째 버전에서 사용한 것과 같은 간단한 "int()"메소드가 있습니다. 문제는 문자열을 비교하는 것이 파이썬이 알파벳 순서를 사용한다는 것입니다. 예 : "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:])))) 
관련 문제