2015-11-02 17 views
-1

我使用以下代碼創建等級分佈函數:Python的等級分佈函數,計數和打印的次數的量發生級

def distribution(grades): 
available_grades = [ 'A+','A','A-','B+','B','B-','C+','C','C-','F']  
fin = open(grades,'r') 
gradesList = fin.readline().split(' ') 
for c_grade in available_grades: 
    if c_grade in gradesList: 
     print('students got '+c_grade) 

我使用的是grades.txt文件,其中包括所有的成績和我需要一種方法來計算一個檔次在文本文件中出現的次數和打印這樣的號碼,以便:

distribution('grades.txt') 
6 students got A 
2 students got A- 
3 students got B+ 
2 students got B 
2 students got B- 
4 students got C 
1 student got C- 
2 students got F 

,但目前只打印此:

students got A 
students got A- 
students got B+ 
students got B 
students got B- 
students got C 
students got C- 
students got F 

我grades.txt文件包括:

A A- C F C C B- B A A A- B B+ B+ B+ C C- B- A A A F 
+1

您需要提供什麼你的成績文件看起來像一個樣本。 – BrenBarn

+0

我的歉意,我會加入到我的問題。 –

+0

爲什麼你不想使用集合?它更快,更簡單,代碼更少。 – daniel451

回答

1

如果你不想使用集合,那麼下面應該工作:

def distribution(grades): 
    available_grades = [ 'A+','A','A-','B+','B','B-','C+','C','C-','F'] 
    grade_dict = {} 
    for grade in available_grades: 
     grade_dict[grade] = 0 

    fin = open(grades,'r') 
    gradesList = fin.readline().split() 
    fin.close() 

    for grade in gradesList: 
     grade_dict[grade] += 1 

    for grade in available_grades: 
     print(str(grade_dict[grade]) + ' students got ' + grade) 

注意,我刪除了參數split(),這樣它會刪除所有的空白,而不僅僅是空間。

+0

偉大的我喜歡你的答案,因爲我寧願使用這種方法比收集方法,非常感謝你。 –

+1

爲什麼你不想使用集合?它更快,更簡單,代碼更少。 – daniel451

+0

對不起,想在問題下張貼,不是你的回答^^ Nevermind。 – daniel451

2

使用collections.Counter

def distribution(grades): 
    available_grades = ['A+','A','A-','B+','B','B-','C+','C','C-','F']  
    with open(grades, 'r') as fin: 
     gradeCounts = collections.Counter(fin.readline().split()) 
    for grade in available_grades: 
     print(gradeCounts[grade], 'students got', grade) 
0

您可以使用Python Counter類此。

from collections import counter 

# creates a new Counter object 
c = Counter() 

# your file contents 
lst_grades = "A A- C F C C B- B A A A- B B+ B+ B+ C C- B- A A A F" 

# turn lst_grades to a list containing the grades 
lst_grades = lst_grades.split(" ") 

# printing lst_grades for a better idea what lst_grades looks like now 
# lst_grades 
# > ['A', 'A-', 'C', 'F', 'C', 'C', 'B-', 'B', 'A', 'A', 'A-', 'B', 'B+', 
# 'B+', 'B+', 'C', 'C-', 'B-', 'A', 'A', 'A', 'F'] 

# call the update method of the counter c 
# update takes an iterable (e.g. a list) 
# and counts the values inside this iterable 
c.update(lst_grades) 

# now our counter contains a dictionary with the counted grads 
# c 
# > Counter({'A': 6, 'C': 4, 'B+': 3, 'B': 2, 'F': 2, 
#   'B-': 2, 'A-': 2, 'C-': 1}) 

# you can simply access every counted entry 
# c["A"] 
# > 6 
0

或者,大熊貓的解決方案:

fin = open(grades,'r') 
grades_given = fin.readline().split() 
fin.close() 

pd.Series(grades_given).value_counts().reset_index(name='cnt').\ 
apply(lambda x: "{cnt} students got {grade}".format(cnt=x['cnt'], 
     grade=x['index']),axis=1) 

0  6 students got A 
1  4 students got C 
2 3 students got B+ 
3 2 students got A- 
4 2 students got B- 
5  2 students got F 
6  2 students got B 
7 1 students got C-