从Python列表中获取整数

Pie*_*ico 2 python list

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

unu*_*tbu 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))
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)