我对编程很新,我只是在学习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")
Run Code Online (Sandbox Code Playgroud)
你可以使用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))
Run Code Online (Sandbox Code Playgroud)
正则表达式模式的解释:
`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".
Run Code Online (Sandbox Code Playgroud)
的r前面'sur|/'是Python语法导致Python来解释'sur|/'作为原始字符串.这会影响反斜杠的解释方式.re模块的文档以这种方式解释了它的用法:
正则表达式使用反斜杠字符(
'\')来表示特殊形式或允许使用特殊字符而不调用它们的特殊含义.这与Python在字符串文字中用于相同目的的相同字符的使用相冲突; 例如,要匹配文字反斜杠,可能必须写'\\\\'为模式字符串,因为正则表达式必须是\\,并且每个反斜杠必须表示为\\常规Python字符串文字.解决方案是使用Python的原始字符串表示法来表示正则表达式模式; 在前缀的字符串文字中,不以任何特殊方式处理反斜杠
'r'.所以r"\n"是一个包含'\'和的双字符字符串'n',"\n"而是包含换行符的单字符字符串.通常,模式将使用此原始字符串表示法在Python代码中表示.
有关原始字符串的完整故事,请参阅语言参考文档.
虽然在这种情况下原始字符串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]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
372 次 |
| 最近记录: |