我正在尝试调整会吐出学生成绩的练习,以便不要将名称放在代码中,例如
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))
我觉得我误解了有关用户输入如何使用/处理的事情,或者与格式字符串,词典有关?
简而言之 - 不要尝试这样做。您不应该使用用户输入来指变量,因为它是凌乱的。相反,您可以使用嵌套词典。尝试以下操作 - 我删除了您的方法以保持这种简洁,但请确保您仍然包括它们:
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():
(并报告错误消息,如果找不到名称。
,因为 @mpf82已经说您的用户输入只是一个普通字符串,不会引用您的字典。您可以做的是将您的字典添加到集合中,并使列表理解以获取正确的字典。
pupils = [lloyd, alice, tyler]
student = next(x for x in pupils if x["name"].lower()==pupil)
对于第二行,请参见:查找与标准匹配的第一个序列项目
我认为这看起来并不好,但是它会在这里解决问题。
请注意,如果您有更多具有相同名称的学生,最终只会出现第一次出现
-
对于字典访问,您必须使用与字典中的密钥完全等于键。如果您使用诸如
'alice'
的小写字符串,则密钥应完全是'alice'
,而不是例如。'Alice'
。 -
要按名称访问某些东西,将其放入dict中。您不能(或者不应该(尝试按名称查找变量。
这是一个工作示例:
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.'