如何计算Python 2.7中用空格分隔的多个输入?

时间:2016-02-26 15:57:09

标签: python python-2.7

def checkGrade(raw):
    ''' (int) -> object (i.e., int OR str)
     Assign grade from raw score
    >>> checkGrade(74)
    3
    >>> checkGrade(82)
    4
    >>> checkGrade(-5)
    'Error, raw score exceed min score'
    >>> checkGrade(210)
    'Error, raw score exceed max score'
    '''
    if raw>100:
        score = "Error, raw score exceed max score" 
    elif raw>80:
        score = 4.00
    elif raw>70:
        score = 3.00
    elif raw>60:
        score = 2.00
    elif raw>50:
        score = 1.00
    elif raw>0:
        score = 0
    else:
        score = "Error, raw score exceed min score" 
    return score

现在我想做这样的事情(显示在docstring中):

def calGPA(n):
    ''' (str) -> float
    Take all the raw scores, limited to 10 subjects, and 
    calculate GPA. Raw scores must be in range of 0 - 100.
    >>> calGPA("77 45 77 55 87")
    2.2
    >>> calGPA("66 67 45 89")
    2.0
    >>> calGPA("87 91 84 89") 
    4.0
    >>> calGPA("87 91 84 103")
    'Error'
    >>> calGPA("77 45 77 55 87 21 35 65 98 12 23 45") 
    'Error'
    '''

原始标记输入是以空格分隔的字符串。如何从这样的输入中使用checkGrade()函数计算GPA?我试过这个:

map(int, s.split())

但它不起作用。

已修改为添加新要求

如果我想将所有输入更改为calGPA("A B C D F")而非calGPA("80 70 63 55 40")之类的字母,并且输入包含除“A”,“B”,“C”,“D”之外的任何内容, “F”如calGPA("A C B Z S")则输出应为“错误”。如果元素不是“A”,“B”,“C”,“D”,“F”之一,我该怎么办才能获得“错误”?

4 个答案:

答案 0 :(得分:1)

简单地将字符串中的所有项目转换为整数,然后将函数应用于每个类似的数字

checkGPA = lambda data: map(checkGrade, map(int, data.split())) # apply the function to int

答案 1 :(得分:0)

CalGPA(int(x) for x in s.split())将有效。

答案 2 :(得分:0)

您需要拆分包含原始标记的字符串,然后使用checkGrade函数获取该原始标记的分数。试试这个:

def checkGrade(raw):
    if raw>100:
        score = "Error, raw score exceed max score" 
    elif raw>80:
        score = 4.00
    elif raw>70:
        score = 3.00
    elif raw>60:
        score = 2.00
    elif raw>50:
        score = 1.00
    elif raw>0:
        score = 0
    else:
        score = "Error, raw score exceed min score" 
    return score

def calGPA(s):
    raw_marks = s.split()
    num_subjects = len(raw_marks)
    if num_subjects > 10:
         print('Limit for number of subjects exceeded')
         return
    total = 0
    for raw in raw_marks:
        total += checkGrade(int(raw))
    print('GPA: {}'.format(total/num_subjects))

calGPA("77 45 77 55 87")

输出:

GPA 2.2

修改以反映您的新要求

def calGPA(s):
    gpas = s.split()
    valid_grades = ['A', 'B', 'C', 'D', 'F']
    if not all(gpa in valid_grades for gpa in gpas):
        print("Error")

PS:编辑问题的方式是使当前接受的答案无效不允许

答案 3 :(得分:0)

使用此:

def calGPA(n):
    iter = map(int, n.split())
    return sum(checkGrade(x) for x in iter)/len(iter) if len(iter)<10 and all(el <100 for el in iter) else 'Erreur'

all(el <100 for el in iter会检查iter中的所有元素是否在0-100范围内。如果一个元素超出范围,它将返回False