我的代码有问题,但我知道问题是什么。等级有2个字符,因此显示2个结果,每个结果加0.3。这是一个问题,因为只有一个结果应该打印到控制台。
keydict = {'A': 4.0,'B': 3.0,'C': 2.0,'D': 1.0,'F': 0, '+': 0.3, '-': -0.3}
grade = input('Grade:')
def letter2number(letter):
if len(grade) > 2:
print('Too many characters')
letter2number(grade)
for char in grade:
if char in keydict:
if '+' in grade:
print(keydict[char] + keydict['+'])
elif '-' in grade:
print(keydict[char] + keydict['-'])
else:
print(keydict[char])
else:
print(grade,'is an invalid input')
return
letter2number(grade)
这是在用户输入" A +"(或任何等级为' +'或' - '我意识到for循环导致了这个问题,因为输入中有2个字符。但是,如果不使用for循环,我认为还有另一种方法可以做到这一点。预计4.3,0.6不是我想要的。
Grade: A+ # <<< Thats a user input
4.3 # <<< YES
0.6 # <<< How can I get this to NOT print
除了正在打印的0.6之外,我对代码没有其他问题。换句话说,我不希望0.6在那里,但4.3应该留下来。
答案 0 :(得分:5)
此处不需要for
循环,导致您的问题。请记住,for
循环将独立查看两个字符
"A" # evaluates to 4.0, add 0.3 since '+' exists in the string
"+" # evaluates to 0.3, add 0.3 since '+' exists in the string
这绝对不是你想要的。你应该做的是:
def lettertograde(letter):
letter, *modifier = letter
grade = keydict[letter]
if "+" in modifier:
grade += 0.3
elif "-" in modifier:
grade -= 0.3
return grade
这个a, *b = ...
语法是splat解包,并通过从迭代中拉出部分来实现:
a, *b = "A" # a = "A", b = []
a, *b = "A+" # a = "A", b = ["+"]
a, *b = "A-" # a = "A", b = ["-"]
a, *b = "Good job!" # a = "G", b = ["o", "o", "d", " ", "j", "o", "b", "!"]
a, *b = "" # ValueError("not enough values to unpack (expected at least 1, got 0)")
N.B。同一表达式中的多个splats引入歧义,并且是不允许的。
a, *b, c, *d = "anything" # SyntaxError("two starred expressions in assignment")
答案 1 :(得分:1)
>>> keydict = {'A': 4.0,'B': 3.0,'C': 2.0,'D': 1.0,'F': 0, '+': 0.3, '-': 0.3, ' ': 0.0}
>>> grade = input('Grade:') + ' '
>>> if grade[0] in keydict and grade[1] in keydict:
print(grade, keydict[grade[0]]+ keydict[grade[1]])
else:
print(grade, 'is an invalid input')
B 3.0 香蕉是无效的输入 B-2.7
答案 2 :(得分:0)
您需要在块break
if char in keydict:
keydict = {'A': 4.0,'B': 3.0,'C': 2.0,'D': 1.0,'F': 0, '+': 0.3, '-': -0.3}
grade = input('Grade:')
def letter2number(letter):
if len(grade) > 2:
print('Too many characters')
letter2number(grade)
for char in grade:
if char in keydict:
if '+' in grade:
print(keydict[char] + keydict['+'])
elif '-' in grade:
print(keydict[char] + keydict['-'])
else:
print(keydict[char])
break # <<---
else:
print(grade,'is an invalid input')
return
letter2number(grade)
break
停止循环
答案 3 :(得分:0)
生成修改后的成绩并将其添加到词典中。然后查看整个成绩字符串。
>>> keydict = {'A': 4.0, 'B': 3.0, 'C': 2.0, 'D': 1.0, 'F': 0}
>>> modifiers = {'+': 0.3, '-': -0.3}
>>> keydict.update({ k + mk: v + mv for k, v in keydict.items() for mk, mv in modifiers.items() })
>>> keydict
{'D': 1.0, 'F+': 0.3, 'A+': 4.3, 'F': 0, 'F-': -0.3, 'C+': 2.3, 'B': 3.0, 'C': 2.0, 'D-': 0.7, 'C-': 1.7, 'B-': 2.7, 'D+': 1.3, 'B+': 3.3, 'A-': 3.7, 'A': 4.0}
>>> grade = 'C-'
>>> keydict[grade]
1.7