从Python列表中获取整数

时间:2013-07-25 19:33:01

标签: 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")

4 个答案:

答案 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". 

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]