2013-01-17 67 views
0
def open_marks(): 
    N = (int(input('how many students? '))* 5) 
    students = [] 
    for line in open('marks.txt').readlines(): 
     datafile = (line.strip().split('\t')[0].split(',')) 
     for n in datafile: 
      students.append(int(n)) 
    students=students[:N] 
    return students 
def open_marks1(): 
    students = open_marks() 
    students1=students[0::5]#set to return only the first(lowest) marks drawn 
    return students1 
def open_marks2(): 
    students = open_marks() 
    students2=students[1::5]#set to return only the second marks drawn 
    return students2 
def open_marks3(): 
    students = open_marks() 
    students3=students[2::5]#set to return only the third marks drawn 
    return students3 
def open_marks4(): 
    students = open_marks() 
    students4=students[3::5]#set to return only the fourth marks drawn 
    return students4 
def open_marks5(): 
    students = open_marks() 
    students5=students[4::5]#set to return only the fifth(highest) marks drawn 
    return students5 


def count_ranges_one(): 

    students1 = open_marks1() 
    print('first number: ',students1) 
    range_counts1 = [0] * 12 
    for num in students1[:]:#change number to select number of draws 
     which_range=int(num//5) 
     range_counts1[which_range] = range_counts1[which_range] + 1 
    return range_counts1 
def count_ranges_two(): 
    students2 = open_marks2() 
    print('second number: ',students2) 
    range_counts2 = [0] * 12 
    for num in students2[:]:#change number to select number of draws 
     which_range=int(num//5) 
     range_counts2[which_range] = range_counts2[which_range] + 1 
    return range_counts2 
def count_ranges_three(): 
    students3 = open_marks3() 
    print('third number: ',students3) 
    range_counts3 = [0] * 12 
    for num in students3[:]:#change number to select number of draws 
     which_range=int(num//5) 
     range_counts3[which_range] = range_counts3[which_range] + 1 
    return range_counts3 
def count_ranges_four(): 
    students4 = open_marks4() 
    print('fourth number: ',students4) 
    range_counts4 = [0] * 12 
    for num in students4[:]:#change number to select number of draws 
     which_range=int(num//5) 
     range_counts4[which_range] = range_counts4[which_range] + 1 
    return range_counts4 
def count_ranges_five(): 
    students5 = open_marks5() 
    print('fifth number: ',students5) 
    range_counts5 = [0] * 12 
    for num in students5[:]:#change number to select number of draws 
     which_range=int(num//5) 
     range_counts5[which_range] = range_counts5[which_range] + 1 
    return range_counts5 

我在格式标记学生的文本文件: 7,5,10,25,32 9,15,25,39,18 等 以上组根据位置标记(1,2,3,4或5),然后有一个例程'写'直方图'以显示标记的分布。我写的是非常笨拙和重复性的,但是我无法弄清楚循环函数将数据分组为每个问题的标记,然后提供直方图的每个范围的数量。请有人可以帮我解决这个问题。Python中循环,从而减少重复

回答

2

你知道你可以将参数传递给你的函数吗?五个open_marks[1-5]功能可以概括为这样:

def open_marks_for_student(n): 
    students = open_marks() 
    return students[n-1::5] 

如果现在通过如3的功能,你会得到相同的结果,从旧open_marks3功能:

open_marks_for_student(3) 

同样的原则也适用于count_ranges功能,只写一个广义函数,并传递标志作为参数:

def count_ranges(marks): 
    range_counts = [0] * 12 
    for num in marks[:]: #change number to select number of draws 
     which_range=int(num//5) 
     range_counts[which_range] = range_counts1[which_range] + 1 
    return range_counts 

现在这样使用它:

def get_range_counts(): 
    range_counts = [] 
    student_nums = [1,2,3,4,5] #or range(1,6) 
    for n in student_nums: 
     marks = open_marks_for_student(n) 
     range_counts.append(count_ranges(marks)) #create histogram, append to list 
    return range_counts 

仍然有一些优化一个可以作出如只打开一次标记文件而不是每个学生一次,或者在count_ranges的循环中删除marks上的切片(如果您打算修改循环中的原始列表,则只需要遍历副本),但这应该足够了让你开始。

+0

非常感谢。将通过您的建议,并尝试执行 – user1478335

+0

我按照你的建议。发生的问题是,当打开IDLE时,系统会询问您输入的学生人数,然后在输入get_range_counts()后,程序会再次询问五次此信息,然后提供正确的答案。这显然是因为函数调用了open_marks五次。这是我无法改变的 – user1478335