Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将用户输入的内容转换为参考字典?_Python_User Input - Fatal编程技术网

Python 将用户输入的内容转换为参考字典?

Python 将用户输入的内容转换为参考字典?,python,user-input,Python,User Input,我正在尝试修改一个练习,它会给出一个学生的分数,这样就不用把名字写在代码中了 print get_letter_grade (get_average(alice)) 我想使用用户输入。 我个人倾向于用大写字母(即Alice)自动键入姓名,因此我需要使用.lower() 只要我不使用大写,代码就可以不使用.lower 这些错误似乎适用于所有小写输入AttributeError:“dict”对象没有属性“lower” 对于大写(即Alice)输入:name错误:未定义名称“Tyler”: pup

我正在尝试修改一个练习,它会给出一个学生的分数,这样就不用把名字写在代码中了

print get_letter_grade (get_average(alice))
我想使用用户输入。 我个人倾向于用大写字母(即Alice)自动键入姓名,因此我需要使用
.lower()
只要我不使用大写,代码就可以不使用
.lower

这些错误似乎适用于所有小写输入
AttributeError:“dict”对象没有属性“lower”

对于大写(即Alice)输入:
name错误:未定义名称“Tyler”:

 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))
以及:

以下是完整的代码:

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
语句,我假设您使用的是Python2.x,在这种情况下,您应该使用
raw\u input()
而不是
input()
。我们使用
.title()
转换此输入,以匹配字典键的标题大小写。此外,我们还添加了一个检查,以查看字典中是否存在该瞳孔(
if-pullow-in-all_-pullows.keys():
),如果找不到该名称,则报告一条错误消息。

简而言之,不要尝试这样做。您不应该使用用户输入来引用变量,因为它很混乱。您可以改为使用嵌套字典。尝试以下方法-我已删除了您的方法以保持简洁,但请确保您仍然包含这些方法:

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
语句,我假设您使用的是Python2.x,在这种情况下,您应该使用
raw\u input()
而不是
input()
。我们使用
.title()
转换此输入,以匹配字典键的标题大小写。此外,我们还添加了一个检查,以查看字典中是否存在该瞳孔(
if-pullow in all_-pullows.keys():
),如果找不到该名称,则报告一条错误消息。

正如@mpf82所说,您的用户输入只是一个普通字符串,不会引用您的字典。你可以做的是将你的字典添加到一个集合中,并列出一个列表,以便按名称获得正确的字典

pupils = [lloyd, alice, tyler]

student = next(x for x in pupils if x["name"].lower()==pupil)
第二行见:

我想这看起来不太好,但在这里它会起作用的


请注意,如果您有更多同名的学生,您将只得到第一次出现的结果,因为@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.'
  • 对于字典访问,您必须使用与字典中的键完全相同的键。如果您使用像
    '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.'

如果输入是
alice
,那么作为
student
您得到的只是字符串
“alice”
——它决不会突然变成对您的全局
alice
字典的引用。小贴士:从小处开始。与其编写完整的程序,不如从根据用户输入识别和引用正确的词典开始。如果输入是
alice
,那么作为
student
你得到的只是字符串
“alice”
——它决不会突然变成对你的全局
alice
字典的引用。小贴士:从小处开始。与其编写完整的程序,不如从根据用户输入识别和引用正确的词典开始。通过这种方式,可以减少潜在的错误。来自@asongtoruin的答案是更好的解决方案,同时考虑到多个学生的问题@asongtoruin的答案是更好的解决方案,同时考虑到多个学生的问题。我试图对其进行编辑,以便:学生={'lloyd':{“name”:“lloyd”,“家庭作业”:[90.0,97.0,75.0,92.0],“测验”:[88.0,40.0,94.0],“测试”:[75.0,90.0],}学生=原始输入(“哪个学生?”)。如果学生中的学生:学生=学生[学生]打印获得字母/成绩(获得平均成绩(学生))其他:打印“未知学生”。---但现在显示“未知学生”。“不管我输入什么:smy bad,忘了下括号()谢谢!我试图编辑它,这样:学生={'lloyd':{“名字”:“lloyd”,“家庭作业”:[90.0,97.0,75.0,92.0],“测验”:[88.0,40.0,94.0],“测试”:[75.0,90.0]},}学生=原始输入(“哪个学生?”)。如果学生是学生,则更低:学生=学生[学生]打印获得字母/分数(平均(学生))el