我对编程很陌生,我只是在学习Python。我在下面写的代码是一个程序,让你输入一个等级(例如14/20或70,超过100),然后给你一个从A到E的等级。基本上我想知道的是如果有办法“取出”列表的整数而不是一个接一个地将它们乘以10,100等等。
我总结一下:我希望成绩[“14 sur 20”]成为a = 14而b = 20,而不必编写我写的所有代码。
PS:我猜我的代码太长了,但我是Python的新手,我还没有足够的知识来缩短它,所以不要太难;)import os
grade = input ("Entrez votre note :")
deter = []
redet = []
i = z = a = b = x = 0
while i < len(grade):
if grade[i] == "s" and grade[i+1] == "u" and grade [i+2] == "r" : #checking if the grade is written as " x sur y"
while z < i-1 : #building a list for the grade
deter.append (grade[z])
z += 1
z += 5 #jumping to the scale
while z < len(grade) : #building a list for the scale
redet.append (grade[z])
z += 1
elif grade[i] == "/" : #means grade is written as "x/y"
while z < i : #building a list for the grade
deter.append (grade[z])
z += 1
z += 1 #jumping to the scale
while z < len(grade) : #building a list for the scale
redet.append (grade[z])
z += 1
i += 1
redet = list (map(float, redet)) #converting to integers
deter = list (map(float, deter))
if len(deter)>1 :
y = 10**(len(deter)-1)
else:
y = 1
while x < len(deter) : #making variables
a = a + deter[x]*y
x += 1
y /= 10
x = 0
if len(redet)>1 :
y = 10**(len(redet)-1)
else :
y = 1
while x < len(redet) : #making variables
b = b + redet[x]*y
x += 1
y /= 10
grade = a/b
if grade >= 0.8 :
print("A")
elif grade >= 0.6 :
print("B")
elif grade >= 0.5 :
print("C")
elif grade >= 0.4 :
print("D")
elif grade <= 0.4 :
print("E")
os.system ("pause")
答案 0 :(得分:5)
您可以使用re.split将14 sur 20
或14/20
等字符串拆分为两部分。
您可以使用bisect.bisect将分数转换为字母等级。
import bisect
import re
def lettergrade(score, breakpoints = [40, 50, 60, 80], grades = 'EDCBA'):
"""
>=80 -> A
>=60 -> B
>=50 -> C
>=40 -> D
else -> E
"""
i = bisect.bisect(breakpoints, score)
return grades[i]
grade = input("Entrez votre note : ")
a, b = map(int, re.split(r'sur|/', grade))
print(lettergrade(100.0*a/b))
正则表达式模式的解释:
`re.split(r'sur|/', grade)` splits the string `grade` into a list of strings. It splits on the regex pattern `r'sur|/'`. This regex pattern matches the literal string `sur` or the forward-slash `/`. The `|` is the regex syntax for "or".
r
前面的'sur|/'
是Python语法,它会导致Python将'sur|/'
解释为raw string。这会影响反斜杠的解释方式。 docs for the re module以这种方式解释它的用法:
正则表达式使用反斜杠字符(
'\'
)来表示 特殊形式或允许使用特殊字符 唤起他们的特殊意义。这与Python的使用相冲突 字符串文字中用于相同目的的相同字符;对于 例如,要匹配文字反斜杠,可能需要编写'\\\\'
作为模式字符串,因为正则表达式必须是\\
,和 每个反斜杠必须在常规Python字符串中表示为\\
文字。解决方案是使用Python的常规字符串表示法 表达模式;反斜杠不以任何特殊方式处理 带有
'r'
前缀的字符串文字。所以r"\n"
是一个双字符串 包含'\'
和'n'
,而"\n"
是一个单字符的字符串 包含换行符。通常模式将用Python表示 使用此原始字符串表示法的代码。
有关原始字符串的完整故事,请参阅the language reference doc。
虽然在这种情况下原始字符串r'sur|/'
与普通字符串'sur|/'
相同,但总是使用原始字符串制作正则表达式模式也许是一种好习惯。在这种情况下它并没有受到伤害,并且在其他情况下肯定会有所帮助。
由于re.split
返回字符串列表,map(int, ...)
用于将字符串转换为ints
:
In [37]: grade = '14 sur 20'
In [38]: re.split(r'sur|/', grade)
Out[38]: ['14 ', ' 20']
In [39]: map(int, re.split(r'sur|/', grade))
Out[39]: [14, 20]
答案 1 :(得分:0)
a,b = map(int,input ("Entrez votre note :").lower().split("sur"))
假设输入与你说的相符,那应该可以正常工作。
答案 2 :(得分:0)
def printLetterGrade(rawGrade):
grade = rawGrade/20
if grade >= 0.8 :
print("A")
elif grade >= 0.6 :
print("B")
elif grade >= 0.5 :
print("C")
elif grade >= 0.4 :
print("D")
elif grade <= 0.4 :
print("E")
rawGrade = int(input ("Entrez votre note entre 1 et 20:"))
printLetterGrade(rawGrade)
IIRC法国评分量表总是以20为基数,所以只要告诉他们输入他们的等级而不是基数,那么你就可以接受你想要的输入。
答案 3 :(得分:0)
这可能有用:
>>> s = "15 over 20"
>>> s.split()
['15', 'over', '20']
>>> [int(x) for x in s.split()]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'over'
>>> [int(x) for x in s.split() if x.isdigit()]
[15, 20]