Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在本例中不硬编码函数_Python_Python 3.x - Fatal编程技术网

Python 如何在本例中不硬编码函数

Python 如何在本例中不硬编码函数,python,python-3.x,Python,Python 3.x,以下链接包含函数应通过的2个csv文件 但是,我的函数只能传递第二个链接文件,因为它是硬编码到范围(4,8)。 输出:[91.5,73.5,81.5,91.5] 输入文件将从第4个元素开始,但不一定在第8个元素结束 def class_avg(open_file): '''(file) -> list of float Return a list of assignment averages for the entire class given the open

以下链接包含函数应通过的2个csv文件

但是,我的函数只能传递第二个链接文件,因为它是硬编码到
范围(4,8)
。 输出:
[91.5,73.5,81.5,91.5]

输入文件将从第4个元素开始,但不一定在第8个元素结束

def class_avg(open_file):
    '''(file) -> list of float
    Return a list of assignment averages for the entire class given the open
    class file. The returned list should contain assignment averages in the
    order listed in the given file.  For example, if there are 3 assignments
    per student, the returned list should 3 floats representing the 3 averages.
    '''
    marks=[[],[],[],[]]
    avgs = []
    for line in open_file:
        grades_list = line.strip().split(',')
        for idx,i in enumerate(range(4,8)):
            marks[idx].append(float(grades_list[i]))
    for mark in marks:
        avgs.append(float(sum(mark)/(len(mark))))
    return avgs
如何修复此问题,使我的代码能够读取这两个文件或任何文件? 我已经打开了该文件,并在同一文件的上一个函数中使用file.readline()迭代了第一行。 提前谢谢大家的帮助

更新进度:

尝试以下操作:

def class_avg(open_file, start = 4, end = 8):
...
...
    for idx,i in enumerate(range(start, end)):

由于两组数据都从同一个位置开始,因此以下操作有效
对于idx,枚举中的i(范围(4,len(等级列表)):

这应该满足到目前为止我所知道的所有要求

def class_avg(open_file):
    '''(file) -> list of float
    Return a list of assignment averages for the entire class given the open
    class file. The returned list should contain assignment averages in the
    order listed in the given file.  For example, if there are 3 assignments
    per student, the returned list should 3 floats representing the 3 averages.
    '''
    marks = None
    avgs = []
    for line in open_file:
        grades_list = line.strip().split(',')
        if marks is None:
            marks = []
            for i in range(len(grades_list) -4):
                marks.append([])
        for idx,i in enumerate(range(4,len(grades_list))):
            marks[idx].append(int(grades_list[i]))
    for mark in marks:
        avgs.append(float(sum(mark)/(len(mark))))
    return avgs
尝试使用以下方法:

     for idx,i in enumerate(range(4,len(grades_list))):
         marks[idx].append(int(grades_list[i]))

考虑到您知道有多少作业,并相应地初始化了标记列表。

好建议,但问题是我们不允许更改输出方法,它必须是“def class_avg(open_file)”,您需要将输入文件从第4个元素重新组织到第8个元素。输入文件将从第4个元素开始,但不一定在第8个元素结束。您需要在第8个元素之后的下一个元素中使用其他delimeter,如“;”Hello,World,100005940,wordlh1,98,99,97,86;0001;0002;0003”;然后您需要重新触发返回“;”分隔符,并且您得到了所有的0001,0002等数据。因此,我实现了您的修复,但是我得到了这个错误:第78行,在avgs.append(float(sum(mark)/(len(mark)))builtins.ZeroDivision错误:除以零是的,这是因为标记中有4个元素,但只有两个赋值。剩下的两个是空的,长度为零。因此,要么用两个元素初始化标记(这是硬编码,如果在另一个文件中有三个赋值,则会失败),要么在阅读第一行后初始化标记列表,从中可以得到有多少个赋值。因此,我想使用您建议的第二种方法。你的意思是我应该在第一个for循环之前写上marks=[]吗?好的,我刚刚编辑了这个问题以澄清:所以我已经打开了这个文件,并在同一个文件上的上一个函数中用file.readline()迭代了第一行。@RagibAhsan你不能这样乘法来创建列表,然后你创建了四个对同一列表的引用,所有数据都存储在一起。我没有删除任何问题,这是我的第一个问题。我是一个新用户。我不是比格,显然是他班上的另一个学生。哦,我是。很高兴我能帮你们完成周一的作业,嗯。。很高兴看到你在周六晚上工作。不到24小时就要到了。OTL