2013-07-25 119 views
2

我对编程颇为陌生,我只是在学习Python。我在下面写的代码是一个程序,可以让你输入一个等级(例如14/20或70,例如100),然后给你从A到E的等级。基本上我想知道的是如果有办法“清除”列表中的整数,而不是一个接一个地将它们乘以10,100等等。从Python列表中获取整数

我总结:我希望成绩[“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.split14 sur 2014/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". 

'sur|/'前面的r是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] 
+0

这个答案有点超出了提问者的水平。 – Stephan

+0

嗨。感谢你的回答;我认为代码可能不那么简短。我刚刚研究过你的;告诉我,如果我是正确的: bisect.bisect给出了断点的等级位置,如果我们在断点处插入等级并希望保持它的排序。 a,b = map(int,re.split(r'sur | /',grade)) 我对这个有点麻烦。我明白'sur | /'都是在年级搜索到的RE,但其他两个字符串(由于map而变成整数)如何分配给a和b? 在'sur | /'代表什么? – PierreOcinom

+0

关于'bisect.bisect'你完全正确。我已经添加了上面的正则表达式模式的解释。 – unutbu

0
a,b = map(int,input ("Entrez votre note :").lower().split("sur")) 

假设输入与您说的相符,那应该可以正常工作。

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个为基数,所以只告诉他们输入他们的成绩和没有基础,那么你可以接受你想要的输入。

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]