怎么做" array / list"为了制作"(int,list) - >浮"在Python2.7中

时间:2016-03-25 11:02:26

标签: python python-2.7

我有这个功能:

def findScore(g):
    gLetter = ["A", "B", "C", "D", "F"]
    gPoint = [4.0, 3.0, 2.0, 1.0, 0.0]

    for i, v in enumerate(gLetter):
        if v==g:
            gp = gPoint[i]
    return gp

我想接受一些科目,然后通过电话" findScore'来获取每个科目的成绩单。然后再使用一个这样的函数返回GPA:

def findGPA(n, list):

注意到:

  1. 主题数量(n)和等级字母列表(列表)"

  2. findGPA()必须调用findScore()将每个成绩字母转换为成绩点。

  3. 什么是功能体?

    我希望输出应该像:

    >>> findGPA(3, ['A', 'B', 'C'])
    3.0
    >>> findGPA(4, ['B', 'B', 'C', 'B'])
    2.75
    '''
    

3 个答案:

答案 0 :(得分:4)

使用字典作为成绩分数,然后只需对传入的列表中的每个成绩进行查找,将除以等级数除以:

def  grd_dict():
    gLetter = ["A", "B", "C", "D", "F"]
    gPoint = [4.0, 3.0, 2.0, 1.0, 0.0]
    return dict(zip(gLetter, gPoint))


def find_gpa(num, grds):
    scores = grd_dict()
    return sum((scores[g] for g in grds),0.0) / num

输出:

In [2]: find_gpa(4, ['B', 'B', 'C', 'B'])
Out[2]: 2.75

In [3]: find_gpa(3, ['A', 'B', 'C'])
Out[3]: 3.0

就我个人而言,我会在一个函数中完成所有操作并只取一个成绩列表,你可以从传递的列表中获得主题数量,因此不需要数量。

dict是执行查找的最有效方法,但如果必须使用列表,那么您可以使用与biect文档中的示例密切相关的逻辑:

from bisect import bisect_left

def grade(g):
    g_point = [4, 3, 2, 1, 0]
    grades = 'ABCDF'
    i = bisect_left(grades, g)
    return g_point[i]


def find_gpa(grds):
    return sum((grade(g) for g in grds), 0.0) / (len(grds) or 1)

(len(grds) or 1)也会处理一个空列表:

In [44]: find_gpa(['F', 'F', 'F'])
Out[44]: 0.0

In [45]: find_gpa(['B', 'B', 'C', 'B'])
Out[45]: 2.75

In [46]: find_gpa(['A', 'B', 'C'])
Out[46]: 3.0

In [47]: find_gpa([])
Out[47]: 0.0

使用bisect,您可以在log(n)时间搜索已排序的结构,而不是潜在地查看每个元素。

答案 1 :(得分:2)

findGPA实际上并不像你提出的那样需要它的第一个参数,因为你可以找到等级字母列表的长度。

您可以将findScore功能与列表推导结合使用,计算出每个年级的分数,然后将其与sum函数相加。最后,这除以得分列表的长度,使用len函数找到。

这可以这样做:

def findGPA(grades):
    return sum([findScore(x) for x in grades]) / max(len(grades), 1)

然后给出您想要的输出:

>>> findGPA(['A', 'B', 'C'])
3.0
>>> findGPA(['B', 'B', 'C', 'B'])
2.75

答案 2 :(得分:1)

实际上你不需要两个函数,你也可以完全删除find_gpa函数的第一个参数并使用内置的len函数。

>>> gLetter = ["A", "B", "C", "D", "F"]
>>> gPoint = [4.0, 3.0, 2.0, 1.0, 0.0]
>>> mapped_values = dict(zip(gLetter, gPoint))
>>> def find_gpa(score):
...     return sum(mapped_values[g] for g in score) / len(score)
... 
>>> find_gpa(['A', 'B', 'C'])
3.0

如果您使用的是Python 3.4或更新版,则可以使用mean模块中的statistics函数。

演示:

>>> from statistics import mean
>>> def find_gpa(score):
...     return mean(mapped_values[g] for g in score)
... 
>>> find_gpa(['B', 'B', 'C', 'B'])
2.75
>>> find_gpa(['A', 'B', 'C'])
3.0