11.6 直方圖(histograms)
11.6.1 直方圖ADT
直方圖ADT所包含的方法如下:
- Histogram(catSeq):創建直方圖,catSeq爲指定的分類,每一個分類的頻數初始化爲零;
- getCount(category):返回給定分類的頻數;
- incCount(category):給定分類的頻數加一;
- totalCount():返回所有分類的頻數之和;
- iterator():直方圖的迭代器。
從文件中讀取數據,建立一個直方圖。
#-*-coding: utf-8-*-
# 建立直方圖
from maphist import Histogram
def letterGrade(grade):
if grade >= 90:
return 'A'
elif grade >= 80:
return 'B'
elif grade >= 70:
return 'C'
elif grade >= 60:
return 'D'
else:
return 'F'
def printChart(gradeHist):
print "\tGrade Distribution"
letterGrades = ('A', 'B', 'C', 'D', 'F')
for letter in letterGrades:
print " |"
print "%s +"
freq = gradeHist.getCount(letter)
print '*' * freq
print " |"
print " +----+----+----+----+----+----+----+----"
print " 0 5 10 15 20 25 30 35"
def main():
gradeHist = Histogram("ABCDF")
gradeFile = open('cs101grades.txt', 'r')
for line in gradeFile:
grade = int(line)
gradeHist.incCount(letterGrade(grade))
printChart(gradeHist)
if __name__ == "__main__":
main()
#-*-coding: utf-8-*-
# 直方圖的實現
from hashmap import HashMap
class Histogram(object):
def __init__(self, catSeq):
self._freqCounts = HashMap()
for cat in catSeq:
self._freqCounts.add(cat, 0)
def getCount(self, category):
assert category in self._freqCounts, "Invalid histogram category."
return self._freqCounts.valueOf(category)
def incCount(self, category):
assert category in self._freqCounts, "Invalid histogram category."
value = self._freqCounts.valueOf(category)
self._freqCounts.add(category, value+1)
def totalCount(self):
total = 0
for cat in self._freqCounts:
total += self._freqCounts.valueOf(cat)
return total
def __iter__(self):
return iter(self._freqCounts)
- ColorHistogram():創建空的彩色直方圖;
- getCount(red, green, blue):返回給定顏色的頻數;
- incCount(red, green, blue):將給定顏色的頻數加一;
- totalCount():返回所有顏色的頻數;
- iterator():迭代器。