用户输入是否可以引用字典?

时间:2017-05-03 14:30:47

标签: python user-input

我正在尝试调整一个会吐出学生成绩的练习,这样就不会把名字放在代码中,例如

print get_letter_grade (get_average(alice))

我想使用用户输入。 我个人倾向于使用大写(即Alice)自动键入名称,所以我需要使用.lower()来调整我的输入 只要我不使用大写,代码就可以在没有.lower的情况下工作。

错误似乎适用于所有小写输入AttributeError: 'dict' object has no attribute 'lower'

对于大写(即Alice)输入: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))

我觉得我误解了有关如何使用/处理用户输入的内容,或者与格式化字符串,词典有关的内容?

3 个答案:

答案 0 :(得分: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 :(得分: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

我认为这看起来并不好看,但它会在这里发挥作用。

请注意,如果您有更多同名学生,您最终只能获得第一次出现

答案 2 :(得分:1)

  • 对于字典访问,您必须使用与字典中的键完全相同的键。如果您使用'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.'
相关问题