2017-05-03 47 views
0

我試圖去適應一個鍛鍊,將吐出一個學生的成績,而不是把名字中的代碼如Santising用戶輸入引用字典?

print get_letter_grade (get_average(alice)) 

讓我想用用戶輸入。 我個人傾向於使用大寫字母(即愛麗絲)自動輸入姓名,所以我需要使用.lower() 來打造我的輸入,只要我不使用大寫字母,代碼就不需要.lower

的錯誤似乎是所有小寫輸入AttributeError: 'dict' object has no attribute 'lower'

而對於大寫(即愛麗絲)輸入:NameError: name 'Tyler' is not defined:

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

也試過:

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''你得到的''student''實際上只是字符串'' 「愛麗絲」'' - 它絕不會突然變成對全局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聲明,我假設您使用Python 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

@ason​​gtoruin的答案是更好的解決方案,同時也考慮到多個學生問題 – pfreiberger

1
  • 對於字典訪問,您必須使用鑰匙正好等於關鍵在字典裏。如果您使用小寫字符串,如'alice',則您的密鑰應完全是'alice',而不是例如。'Alice'

  • 要按名稱訪問某些內容,請將其放入字典中。你不能(或者說,不應該)試圖通過名字來查找變量

這裏有一個工作示例:

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( 學生)) 其他: 打印 「未知的學生。」 ---但現在它顯示「未知學生」。不管我輸入什麼:s – toonarmycaptain

+0

我的不好,忘了括號後更低() 謝謝! – toonarmycaptain