数据集合体222数据集合体很多程序都需要处理大量类似数据的集合–文档中的大量单词–学校学生,企业客户–实验得到的数据–......333数据集合体回顾:输入一批数据求平均值的程序–无需保存数据:用累积变量sum和count即可–但:求中位数和标准差需要保存全部数据.用很多独立变量保存?中位数,一组数据按从小到大(或从大到小)的顺序依次排列,处在中间位置的一个数(或最中间两个数据的平均数)标准差(StandardDeviation),也称均方差(meansquareerror),是各数据偏离平均数的距离的平均数。标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。平均数相同的,标准差未必相同。444列表有没有一个对象能包含很多数据?Yes!–如range(10)=[0,1,2,3,4,5,6,7,8,9]–又如string.split(“Thisisit.”)=[‘This’,’is’,’it’]列表(List):是一种数据集合体–是数据的有序序列–整体用一个名字表示:如seq–各成员通过下标(索引)引用:如seq[3]555列表与字符串回顾:Python字符串是序列,可通过索引引用列表与字符串的区别:–列表的成员可以是任何数据类型,而字符串中只能是字符;–列表的成员可修改,而字符串不能修改列表与数组很多编程语言提供数组(array)类型.Python列表与数组的区别:–列表是动态的,而数组是定长的–列表元素可以是混合类型的,而数组元素是同类型的6777列表操作对字符串的操作也可应用于列表:–合并:seq+seq–重复:seq*int_expr–索引:seq[index_expr]–分段:seq[start:end]–长度:len(seq)–迭代:forvarinseq:...列表删除:delseq[start:end]列表操作(续)应用于列表的专门方法:–追加:list.append(x)–排序:list.sort()–逆转:list.reverse()–查找:list.index(x)–插入:list.insert(i,x)–计数:list.count(x)–删除:list.remove(x)–弹出:list.pop(i)–隶属:xinlist8编程实例:stats.py#stats.pyfrommathimportsqrtdefgetNumbers():defmean(nums):defstdDev(nums,xbar):defmedian(nums):defmain():data=getNumbers()xbar=mean(data)std=stdDev(data,xbar)med=median(data)print......if__name__==’__main__’:main()9列表与类结合使用类将一些数据与操作封装成一个对象列表将一些同类对象组合成整体这两者的结合可以表示任意复杂的数据集合体.10编程实例:对DieView的改进•将骰子的7个点构成一个列表.(原为7个独立变量)–好处:对整个列表进行操作时,代码变得简单,因为可以应用循环语句.如:forpipinself.pips:pip.setFill(self.background)foriin[0,3,6]:self.pips[i].setFill(self.foreground)–根据掷出的value决定点亮骰子哪些点:可以使用表驱动的写法(见下页)11编程实例:对DieView的改进一(续)forpipinself.pips:self.pip.setFill(self.background)ifvalue==1:on=[3]elifvalue==2:on=[0,6]elifvalue==3:on=[0,3,6]elifvalue==4:on=[0,2,4,6]elifvalue==5:on=[0,2,3,4,6]else:on=[0,1,2,4,5,6]foriinon:self.pips[i].setFill(self.foreground)12编程实例:对DieView的改进二(续)onTable=[[],[3],[2,4],[2,3,4],[0,2,4,6],[0,2,3,4,6],[0,1,2,4,5,6]]forpipinself.pips:self.pip.setFill(self.background)on=onTable[value]foriinon:self.pips[i].setFill(self.foreground)注:这个onTable是不变的,可以作为类的实例变量,由__init__初始化.13141414编程实例:计算器程序=数据结构的集合+处理数据结构的算法的集合因此:整个应用程序本身可看作对象!编程实例:计算器–每个计算器是一个对象元组元组:用圆括号包围的一组值.–类似列表但内容不可修改.–例如:创建计算器按钮的代码:bSpecs=[(2,1,’0’),(3,1,’.’),(1,2,’1’),(2,2,’2’),(3,2,’3’),(4,2,’+’),(5,2,’-’),(1,3,’4’),(2,3,’5’),(3,3,’6’),(4,3,’*’),(5,3,’/’),(1,4,’7’),(2,4,’8’),(3,4,’9’),(4,4,’-’),(5,4,’C’)]self.buttons=[]for(cx,cy,label)inbSpecs:self.buttons.append(Button(self.win,Point(cx,cy),.75,.75,label))#createthelarger’=’buttonself.buttons.append(Button(self.win,Point(4.5,1),1.75,.75,=))15字典:无序集合体列表实现了索引查找:按给定位置检索.很多应用需要“键-值”查找:按给定的键,检索相关联的值–name:John16字典:无序集合体Python提供字典类型,用来存储“键-值对”.–创建:dict={k1:v1,k2:v2,...,kn:vn}–检索:dict[ki]返回相关联的vi–值可修改:dict[ki]=new_value–键类型常用字符串,整数;值类型则任意.–存储:按内部最有效的方式,不保持创建顺序17字典例缩略语字典abbr={‘etc’:’cetera’,‘cf’:’confer’,’ibid’:’ibidem’}查找:abbr[‘etc’]返回cetera修改:abbr[‘etc’]=‘etcetera’18字典例月份映射表month={1:’Jan’,2:’Feb’,3:’March’,4:’April’}显示:printmonth[1]增加键值对:month[4]=‘April’19字典操作键存在性:dicthas_key(key)键列表:dict.keys()值列表:dict.values()键值对列表:dict.items()删除键值对:deldict[key]清空字典:dict.clear()20编程实例:词频统计统计文档中单词的出现次数用字典结构:–counts:{单词:频度计数}–用很多累积变量显然不好!单词首次出现时字典里查不到会出错:try:counts[w]=counts[w]+1exceptKeyError:counts[w]=121编程实例:词频统计(续)对大文档,为每个单词输出频度没有意义.如何输出前n个最频繁的单词?–对单词:频度列表按频度排序list.sort()不行比较函数cmp(x,y):根据x在y之前或相等或之后分别返回-1,0,1自定义比较函数,并用于排序:defmyCmp((w1,c1),(w2,c2)):......list.sort(myCmp)wordfreq.py22作业EX11.772424End