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)对标记进行分组,然后有一个例程来'写'直方图'来显示标记的分布。我写的非常笨拙和重复,但我无法弄清楚循环函数来提供每个问题分组为标记的数据,然后是直方图的每个范围的数字。有人可以帮我解决这个问题。
答案 0 :(得分: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
仍然可以进行一些优化,例如:只打开一次标记文件,而不是每个学生打开一次,或者删除marks
中循环中count_ranges
的切片(如果您计划修改原始列表,则只需要复制一份副本)循环),但这应该足以让你开始。