第5章序列与字典5.1本章要求 了解序列。 掌握列表。 掌握元组。 掌握字符串。 掌握字典。 掌握JSON。5.2本章知识重点〖*45〗5.2.1序列在Python中,最基本的数据结构是序列(sequence)。序列中的元素有序排列,每个元素被分配一个序号,即元素的位置,也称为索引。第一个索引是0,第二个是1,以此类推。也可以采用负号索引,即序列中的最后一个元素位置标记为-1,倒数第二个元素位置为-2,以此类推。Python提供了列表、元组、字符串等序列类型,可以进行某些特定的操作。这些操作包括索引(index)、分片(slice)、加(add)、乘(multiply)以及检查某个元素是否属于序列的成员(成员资格)。除此之外,Python还有计算序列长度、找出最大元素和最小元素的内建函数。5.2.2列表现实生活中的购物清单、手机通讯录等都可以看作一个列表,列表(list)是一组有序项目的数据结构。Python创建列表时,解释器在内存中生成一个类似数组的数据结构来存储数据,数据项自下而上存储。Python列表可以包含混合类型的数据,即在一个列表中的数据类型可以各不相同。列表中的每一个数据称为元素,元素用逗号分隔并放在一对中括号\[和\]中,列表可以认为是下标从0开始的数组。【例51】列表举例。#coding=UTF-8animalist = \[''fox'',''tiger'',''rabbit'',''snake''\]print''Zoo has '',lenanimalist,''animals...''for item in animalist:printitem,print''\\n''animalist.append''pig''del animalist\[0\]animalist.sortfor i in range0,lenanimalist:printanimalist\[i\]运行结果:''Zoo has '', 4, ''animals...''fox tiger rabbit snakepig rabbit snake tiger5.2.3元组元组(tuple)和列表类似,但其元素不可变,即元组一旦创建,用任何方法都不可以修改其元素,因此,元组相当于只读列表。元组与列表相比有如下相同点:(1) 元组的元素与列表一样按定义的次序进行排序。(2) 元组的负数索引与列表一样从尾部开始计数。(3) 元组与列表一样也可以使用分片。元组与列表相比有如下不同点:(1) 元组在定义时所有元素是放在一对圆括号(和)中,而不是方括号。(2) 不能向元组中增加元素,元组没有append或extend方法。(3) 不能从元组删除元素,元组没有remove或pop方法。(4) 元组没有index方法,但是可以使用in方法。(5) 元组可以在字典中被用做键,但是列表不行。元组适合只需进行遍历操作的运算,对于数据进行写保护,其操作速度比列表快。【例52】元组举例。#coding=UTF-8animalist = ''fox'',''tiger'',''rabbit'',''snake''for item in animalist:printitemprint''\\n''animalist.append''pig''运行结果:Traceback most recent call last:File "C:UsersAdministratorPycharmProjectskeygamekeygame.py", line 9, in animalist.append''pig''AttributeError: ''tuple'' object has no attribute ''append''fox tiger rabbit snake5.2.4字符串字符串是用单引号、双引号或者三引号括起来的符号系列,例如以''或"括起来的任意文本,如''abc''、"xyz"等。请注意,''或"本身只是一种表示方式,不是字符串的一部分,因此,字符串''abc''只有a、b、c这3个字符。字符串方法如表5.1所示。表5.1字符串方法函数描述s.indexsub\[,start, end\]s.findsub\[,start,end\]}与index函数一样,但如果找不到会返回-1s.replaceold, new \[,count\]替换s里所有old子串为new子串,count指定多少个可被替换s.countsub\[,start,end\]s.split字符串的split函数默认分隔符是空格。如果没有分隔符,就把整个字符串作为列表的一个元素s.joinjoin方法是split方法的逆方法,用来把字符串连接起来s.lower返回将大写字母变成小写字母的字符串s.upper返回将小写字母变成大写字母的字符串5.2.5字典字典中的元素由一对称为键和值的项构成,元素的键和值之间用冒号分隔,元素之间用逗号分隔,整体用一对大括号{和}括起来。字典语法结构如下:dict_name={key1:value1,key2:value2,}对于字典,应注意如下几点:(1) 键必须是唯一的。(2) 键和值之间用冒号分隔,而各个元素之间用逗号分隔,所有这些都包括在大括号中。(3) 元素没有顺序。【例53】字典举例。#coding=utf-8dict1 ={''zhang'':"张辉",''wang'':"王强",''li'':"李冰",''zhao'':"赵薇"}dict1\[''huang''\] = ''黄家驹''del dict1\[''zhao''\]for firstname,name in dict1.items:print firstname,name运行结果:li 李冰wang 王强huang 黄家驹zhang 张辉5.2.6JSONJSONJavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。JSON不但易于人阅读和编写,而且易于计算机解析和生成。其书写格式为名称:值,例如"firstName":"John"。Python 2.6以上版本自带 JSON 模块,具有序列化(encoding)与反序列化(decoding)。1. 序列化序列化是指将Python对象编码转换成JSON字符串,采用json.dumps方法。【例54】序列化举例。 import json data = \[{''a'':"A",''b'':2,4,''c'':3.0}\] print "DATA:",reprdataDATA: \[{''a'': ''A'', ''c'': 3.0, ''b'': 2, 4}\] data_string = json.dumpsdata print "JSON:",data_stringJSON: \[{"a": "A", "c": 3.0, "b": \[2, 4\]}\]2. 反序列化反序列化是指将JSON格式字符串解码转换成Python对象,采用json.loads方法。【例55】反序列化举例。 import json data = \[{''a'':"A",''b'':2,4,''c'':3.0}\] data_string = json.dumpsdata print "ENCODED:",data_stringENCODED: \[{"a": "A", "c": 3.0, "b": \[2, 4\]}\] decoded = json.loadsdata_string print "DECODED:",decodedDECODED: \[{u''a'': u''A'', u''c'': 3.0, u''b'': \[2, 4\]}\] print "ORIGINAL:",typedata\[0\]\[''b''\]ORIGINAL: print "DECODED:",typedecoded\[0\]\[''b''\]DECODED: 5.3课后习题答案1. 输入一段英文,求其字符串长度,并求出其中包含多少个单词。【解答】s= raw_input"please input a string:"len=lenscounter=0for i in s.split'' '':if i:counter =1print "The length is:%.f"%lenprint "The counter is:%.f"%counter运行结果:please input a string:I am a boyThe length is:10The counter is:42. 输入10个成绩,进行优、良、中、及格、不及格的统计。【解答】counter=0exce=0;good=0;normal=0;pas=0;bad=0while counter=90:exce =1elif number=80:good =1elif number=70:normal =1elif number=60:pas =1else:bad =1counter =1print "exce is:%.f"%exceprint "good is:%.f"%goodprint "normal is:%.f"%normalprint "pas is:%.f"%pasprint "bad is:%.f"%bad运行结果:please input a score:67please input a score:45please input a score:90please input a score:44please input a score:88please input a score:97please input a score:36please input a score:98please input a score:78please input a score:67exce is:3good is:1normal is:1pas is:2bad is:33. 输入10个学生的姓名和成绩构成的字典,按照成绩大小排序。【解答】studscore = {}counter=0while counter studscore = {''a'': 45, ''b'': 78, ''c'': 40, ''d'': 96, ''e'': 65, ''f'': 90, ''g'': 78,''h'': 99, ''i'': 60, ''j'': 87} studscore.values\[45, 40, 78, 65, 96, 78, 90, 60, 99, 87\] studscore.keys\[''a'', ''c'', ''b'', ''e'', ''d'', ''g'', ''f'', ''i'', ''h'', ''j''\]5. 任意输入一串字符,输出其中的不同字符及其个数。例如,输入abcdefgabc,输出为a-2,b-2,c-2,d-1,e-1,f-1,g-1。【解答】#!usrbinenv python# coding=utf-8s=raw_input"please input string: "ms = setsfor item in ms:print item,''-'',s.countitem运行结果:please input string: abcdcbxdcbaxbcca-2x-2c-5b-4d-25.4习题与解答〖*45〗5.4.1习题1. 在列表中输入多个数据作为圆的半径,得出相应的圆的面积。2. 将3行3列的矩阵按其形状输出,例如,输入为\[\[1,2,3\],\[4,5,6\],\[7,8,9\]\],输出为1234567893. 已知列表b1=\[1,2,3\]和b2=\[2,3,4\],求b1和b2的交集和差集。4. 实现Python中的字典和JSON互转操作。5.4.2习题参考答案1. 在列表中输入多个数据作为圆的半径,得出相应的圆的面积。【解答】radius=input''please input radiuses in list''for r in radius:print ''the area of the circle with the radius of %f is:'' %r,3.14rr运行结果:please input radiuses in list\[2,3,4\]the area of the circle with the radius of 2.000000 is: 12.56the area of the circle with the radius of 3.000000 is: 28.26the area of the circle with the radius of 4.000000 is: 50.242. 将3行3列的矩阵按其形状输出,例如,输入为\[\[1,2,3\],\[4,5,6\],\[7,8,9\]\],输出为【解答】a=input''please input a 33 array:''for x in a:s=''''for y in x:s1=''%6d''%ys=s s1print s运行结果:please input a 33 array:\[\[1,2,3\],\[4,5,6\],\[7,8,9\]\]1234567893. 已知列表b1=\[1,2,3\]和b2=\[2,3,4\],求b1和b2的交集和差集。【解答】(1) 交集:b1=\[1,2,3\]b2=\[2,3,4\]b3 = \[val for val in b1 if val in b2\]print b3运行结果:\[2, 3\](2) 差集:b1=\[1,2,3\]b2=\[2,3,4\]b3= \[val for val in b1 if val not in b2\]print b3运行结果:\[1\]4. 实现Python中的字典和JSON互转操作。【解答】Python的字典和JSON在表现形式上非常相似,实际上JSON就是Python字典的字符串表示。 import json stu = ''{"name": "zhang san", "sex": "male", "age": 25}'' b = json.loadsstu b.values\[25, ''zhang san'', ''male''\]