2017-05-03 6 views
0

나는, 학생의 성적을 뱉어 운동을 적응하기 위해 노력하고있어. 개인적으로 대문자 (예 : 앨리스)를 사용하여 자동으로 이름을 입력하는 경향이 있으므로 입력을 사상해야합니다. .lower() 코드는 대문자를 사용하지 않는 한 .lower없이 작동합니다. NameError: name 'Tyler' is not defined:사전을 참조하는 Santising 사용자 입력? 대신 코드 예</p> <pre><code>print get_letter_grade (get_average(alice)) </code></pre> <p>에 이름을 넣는 I는 사용자 입력을 사용할 수 있도록

pupil = input("Which student?").lower() 
    print get_letter_grade (get_average(
     pupil)) 

이 시도 : 또한 시도

pupil = input("Which student?").lower 
    student = pupil 
    print get_letter_grade (get_average(
     student)) 

:

오류

(즉, 앨리스) 입력을 모두 소문자로 입력 AttributeError: 'dict' object has no attribute 'lower'

과 대문자이 될 것으로 보인다

pupil = input("Which student?") 
student = pupil.lower() 
print get_letter_grade (get_average(
    student)) 

그리고 :

pupil = input("Which student?") 
student = pupil 
print get_letter_grade (get_average(input("Which student?").lower())) 

여기에 전체 코드는 다음과 같습니다

lloyd = { 
    "name": "Lloyd", 
    "homework": [90.0, 97.0, 75.0, 92.0], 
    "quizzes": [88.0, 40.0, 94.0], 
    "tests": [75.0, 90.0] 
    } 
alice = { 
    "name": "Alice", 
    "homework": [100.0, 92.0, 98.0, 100.0], 
    "quizzes": [82.0, 83.0, 91.0], 
    "tests": [89.0, 97.0] 
    } 
tyler = { 
    "name": "Tyler", 
    "homework": [0.0, 87.0, 75.0, 22.0], 
    "quizzes": [0.0, 75.0, 78.0], 
    "tests": [100.0, 100.0] 
    } 

def average(numbers): 
    total=sum(numbers) 
    total=float(total) 
    total =total/len(numbers) 
    return total 

def get_average(student): 
    homework = average(student["homework"]) 
    quizzes = average(student["quizzes"]) 
    tests = average(student["tests"]) 
    return float(0.1*homework + 0.3*quizzes + 0.6*tests) 

def get_letter_grade(score): 
    if score>=90: 
     return "A" 
    elif score>=80: 
     return "B" 
    elif score>=70: 
     return "C" 
    elif score>=60: 
     return "D" 
    else: 
     return "F" 

pupil = input("Which student?").lower() 

print get_letter_grade (get_average(
    pupil)) 

내가 사용자의 입력을 처리/사용, 또는 뭔가 포맷 문자열, 사전에 수행하는 방법에 대한 일을 오해하고있어 같은 느낌?

+0

- 그것은 갑자기 전 세계의''alice'' 사전에 대한 언급으로 바뀌지 않을 것입니다. 팁 : 작게 시작하십시오. 본격적인 프로그램을 작성하는 대신 사용자의 입력을 기반으로 올바른 사전을 식별하고 참조하는 것으로 시작하십시오. 그렇게하면 잠재적 오류가 줄어 듭니다. –

답변

4

요약하면 이렇게하지 않으려 고합니다. 사용자 입력을 사용하여 변수를 지저분하게 참조해서는 안됩니다. 대신 중첩 된 사전을 사용할 수 있습니다. 다음을 시도 -이 간결을 유지하지만, 확인하기 위해 귀하의 방법을 제거했습니다 당신은 여전히 ​​포함 : 여기에 변화의

all_pupils = { 
    "Lloyd": { 
     "homework": [90.0, 97.0, 75.0, 92.0], 
     "quizzes": [88.0, 40.0, 94.0], 
     "tests": [75.0, 90.0] 
    }, 
    "Alice": { 
     "homework": [100.0, 92.0, 98.0, 100.0], 
     "quizzes": [82.0, 83.0, 91.0], 
     "tests": [89.0, 97.0] 
    }, 
    "Tyler": { 
     "homework": [0.0, 87.0, 75.0, 22.0], 
     "quizzes": [0.0, 75.0, 78.0], 
     "tests": [100.0, 100.0] 
    } 
    } 

# re-insert methods here... 

pupil = raw_input("Which student?").title() 

if pupil in all_pupils.keys(): 
    print get_letter_grade(get_average(all_pupils[pupil])) 
else: 
    print 'Student not found!' 

커플. print 진술을 기반으로 파이썬 2.x를 사용하고 있다고 가정합니다.이 경우 raw_input()이 아닌 input()을 사용해야합니다. 이 입력은 .title()을 사용하여 사전 키의 대소 문자와 일치시킵니다. 또한 사전에 학생이 있는지 확인 (if pupil in all_pupils.keys():)하고 이름을 찾을 수 없다면 오류 메시지를보고합니다.

1

@ mpf82는 이미 사용자 입력이 일반 문자열이며 사용자의 사전을 참조하지 않는다고 말했습니다. 당신이 할 수있는 일은 당신의 사전을 콜렉션에 추가하고 그 목록으로 정확한 사전을 얻는 것입니다. 두 번째 라인을 참조하십시오

pupils = [lloyd, alice, tyler] 

student = next(x for x in pupils if x["name"].lower()==pupil) 

: find first sequence item that matches a criterion

이 정말 내가 생각하는 좋은 보이지 않는하지만 여기에 트릭을 할 것입니다.

는 이름이 같은 더 많은 학생들을 경우에만 사전 액세스의 경우를 선두

+0

@assongtoruin의 대답은 여러 가지 학생 문제를 다루는 더 좋은 해결책입니다. – pfreiberger

1
  • 에게 그만 둘 것을,주의, 당신은 키에 정확히 동일한 키를 사용해야합니다 사전에. 'alice'과 같은 소문자 문자열을 사용하는 경우 키는 정확하게 'alice'이어야합니다 (예 :'Alice'.

  • 이름으로 액세스하려면 dict에 입력하십시오. 변수를으로 이름을 지정할 수 없습니다 (또는 오히려하지 말아야 함). 여기

는 작업 예제 : 입력이``입니다 alice`` 당신이``로 얻을 모든 student``은 정말 그냥 문자열`` "앨리스"``경우

people = { 
    'ada': { 
     'name': 'Ada Lovelace', 
     'role': 'Programmer', 
    }, 
    'charles': { 
     'name': 'Charles Babbage', 
     'role': 'Hardware designer', 
    }, 
} 

moniker = raw_input('Who? ').lower() 

if moniker in people: 
    person = people[moniker] 
    print person['name'], ',', person['role'] 
else: 
    print 'No idea who is that.' 
+0

다음과 같이 편집하려고 시도했습니다. students = { 'lloyd': { "name": "Lloyd", "숙제" : 90.0, 97.0, 75.0, 92.0, 「퀴즈」: 88.0, 40.0, 94.0, "시험"[75.0, 90.0] }} 퓨필 = raw_input을 ("? 학생") .lower 경우 학생의 학생 : 학생 = 학생들은 [학생] 인쇄 get_letter_grade (get_average ( 학생)) 다른 ". 알 수없는 학생" 인쇄 ---하지만 이제는 "알 수없는 학생"이라고 표시됩니다. 내가 무엇을 입력하든 : – toonarmycaptain

+0

내 잘못, 아래 괄호를 잊어 버렸습니다. thankyou! – toonarmycaptain