2

我对编程很陌生,我只是在学习 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")
4

4 回答 4

5

您可以使用re.split将字符串拆分为14 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". 

前面r'sur|/'Python 语法,它导致 Python 解释'sur|/'原始字符串。这会影响反斜杠的解释方式。re 模块的文档以这种方式解释了它的使用:

正则表达式使用反斜杠字符 ( '\') 来指示特殊形式或允许使用特殊字符而不调用其特殊含义。这与 Python 在字符串文字中出于相同目的使用相同字符相冲突;例如,要匹配文字反斜杠,可能必须写'\\\\' 为模式字符串,因为正则表达式必须是\\,并且每个反斜杠必须\\在常规 Python 字符串文字中表示。

解决方案是对正则表达式模式使用 Python 的原始字符串表示法;在以 .为前缀的字符串文字中,反斜杠不会以任何特殊方式处理'r'。包含andr"\n"的两个字符的字符串也是如此,而包含换行符的一个字符的字符串也是如此。通常,模式将使用这种原始字符串表示法在 Python 代码中表示。'\''n'"\n"

有关原始字符串的完整故事,请参阅语言参考文档

尽管在这种情况下原始字符串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]
于 2013-07-25T19:38:15.227 回答
0
a,b = map(int,input ("Entrez votre note :").lower().split("sur"))

Assuming that the input matches what you say it will, that should work fine.

于 2013-07-25T19:35:10.903 回答
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为基数,所以只要告诉他们输入他们的等级而不是基数,然后你就可以接受你想要的输入。

于 2013-07-25T19:38:51.657 回答
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]
于 2013-07-25T19:42:20.160 回答