1、18.1 元组 列表的功能如此强大,那么内部实现必然非常复杂,这在很大程度上影响了运行效率。元组可以看成轻量级的列表,很多地方类似于列表,但功能要简单一些,在某些情况下也足够使用了。28.1.1元组创建与元素访问 x=(1,2,3)#创建元组变量 x0#访问第一个元素1 x-1#最后一个元素3 x1=4#元组是不可变的,试图改变元素的值会抛出异常TypeError:tuple object does not support item assignment x=(3)#这和x=3是一样的 x3 x=(3,)#元组中只有一个元素,必须在后面多写一个逗号 x(3,)x=()#空元组38.1.1元组创
2、建与元素访问 x=tuple()#定义空元组的另一种形式 tuple(range(5)#将range对象转换为元组(0,1,2,3,4)tuple(hello world)#把字符串转换为元组(h,e,l,l,o,w,o,r,l,d)tuple(1,2,3,4,5)#把列表转换为元组(1,2,3,4,5)tuple(map(str,range(5)#把map对象转换为元组(0,1,2,3,4)tuple(filter(None,-1,0,1,2)#把filter对象转换为元组(-1,1,2)48.1.2元组与列表的异同点 元组和列表都属于有序序列,支持使用双向索引访问其中的元素,使用内置函数
3、len()统计元素个数、max()求最大值、min()求最小值、sum()求元素之和,使用运算符 in 测试是否包含某个元素,使用方法count()统计指定元素的出现次数,使用方法 index()获取指定元素的首次出现位置,元组也可以像列表那样作为 map()、filter()、zip()、reduce()等函数的参数。虽然有很多相似之处,但元组和列表在本质上和内部实现上都有很大的不同。58.1.2元组与列表的异同点 元组是不可变的,一旦创建,就不允许修改元组中元素的值,也无法为元组增加或删除元素。因此,元组没有提供 append()、extend()和insert()等方法,无法向元组中添加
4、元素;同样,元组也没有 remove()和pop()方法,也不支持使用 del 命令从元组中删除元素。从一定程度上可以认为元组是“常量列表”,即不允许修改的列表。68.1.2元组与列表的异同点 元组也支持切片操作,但是只能通过切片来访问元组中的元素,不允许使用切片来修改元组中元素的值,也不支持使用切片来为元组增加或删除元素。Python 的内部实现对元组做了大量优化,访问速度比列表快一些。如果定义了一系列常量值,主要用途仅是对它们进行遍历,而不需要对其元素进行任何修改,那么一般建议使用元组而不用列表。78.1.2元组与列表的异同点 元组在内部实现上不允许修改其元素值,从而使得代码更加安全,如在
5、调用函数时使用元组传递参数可以防止在函数中修改元组,而使用列表则很难做到这一点。最后,作为不可变序列,与整数、字符串一样,元组可作为字典的键,也可以作为集合的元素,而列表则永远都不能作为字典键使用,也不能作为集合中的元素,因为列表是可变的。88.2 字典 字典是包含若干“键:值”元素的无序可变容器类对象,字典中的每个元素包含用冒号分隔的“键”和“值”两部分,表示一种映射或对应关系。字典中每个元素的“键”可以是任意不可变数据,如整数、实数、复数、字符串、元组(其中不能包含列表、字典或集合等可变序列)等类型,但不能使用列表、集合、字典或其他可变类型作为字典的“键”。另外,字典中的“键”不允许重复,
6、但“值”可以重复。98.2.1字典创建与删除 aDict=server:,database:mysql x=dict()#空字典 x=#空字典 keys=a,b,c,d values=1,2,3,4 dictionary=dict(zip(keys,values)#根据已有数据创建字典 d=dict(name=Dong,age=39)#以关键参数的形式创建字典 aDict=dict.fromkeys(name,age,sex)#以给定内容为“键”#“值”为空的字典 aDictname:None,age:None,sex:None108.2.2字典元素的访问 aDict=age:39,score
7、:98,97,name:Dong,sex:male aDictage#指定的“键”存在,返回对应的“值”37 aDictaddress#指定的“键”不存在,抛出异常KeyError:address118.2.2字典元素的访问 aDict.get(age)#字典中存在该“键”则返回对应的“值”39 aDict.get(address,Not Exists.)#“键”不存在时返回指定的默认值Not Exists.128.2.3元素添加、修改与删除 aDict=age:35,name:Dong,sex:male aDictage=39#修改元素值 aDictaddress=Yantai#添加新元素
8、aDictage:39,name:Dong,sex:male,address:Yantai138.2.3元素添加、修改与删除 aDict=age:37,score:98,97,name:Dong,sex:male aDict.update(a:97,age:39)#修改 age 键的值#同时添加新元素 a:97 aDictage:39,score:98,97,name:Dong,sex:male,a:97148.2.3元素添加、修改与删除 aDict=age:37,score:98,97,name:Dong,sex:male aDict.popitem()#弹出一个元素,对空字典会抛出异常(s
9、ex,male)aDict.pop(age)#弹出指定 键 对应的元素37 aDictscore:98,97,name:Dong158.2.4精彩例题分析与解答 例例 5-5 生成包含 1000 个随机字符的字符串,统计每个字符的出现次数。import stringimport random#候选字符集,26个小写字母+26个大写字母+10个数字x=string.ascii_letters+string.digits#生成包含1000个随机字符的字符串z=.join(random.choice(x)for i in range(1000)d=dict()#遍历字符串,统计频次for ch in
10、 z:dch=d.get(ch,0)+1#查看统计结果,按字母顺序排序for k,v in sorted(d.items():print(k,:,v)168.2.4精彩例题分析与解答 例例5-6 小明上班每天都要经过某十字路口,该路口的红绿灯,红灯亮的时长是45秒,黄灯亮的时长是5秒,绿灯亮的时长是50秒。编写程序计算小明遇到红灯、黄灯、绿灯的概率分别是多少。lights=红灯:45,黄灯:5,绿灯:50total=sum(lights.values()for light,timeLength in lights.items():print(light,timeLength/total)17的
11、区域长度该实验中所有事件构成的区域长度构成事件AAP)(8.4 集合 一般将要研究的个体统称为元素,将某个问题的全部待研究个体组成的总体称为集合。集合中的元素具有确定性、互异性和无序性。在 Python 中,集合属于无序可变容器对象,使用一对花括号作为定界符,元素之间使用逗号分隔,同一个集合内的每个元素都是唯一的,元素之间不允许重复。集合中只能包含数字、字符串、元组(元组中不能包含列表、字典或集合)等不可变类型的数据,而不能包含列表、字典、集合等可变类型的数据。188.4.1集合创建与删除 a=3,5#创建集合对象 a_set=set(range(8,14)#把range对象转换为集合 a_s
12、et8,9,10,11,12,13 b_set=set(0,1,2,3,0,1,2,3,7,8)#自动去掉重复元素 b_set0,1,2,3,7,8 x=set()#空集合 set(hello world)#把字符串转换为集合l,r,w,h,e,o,d set(1,2,3,3,4)#把元组转化为集合1,2,3,4 set(map(str,range(5)#把map对象转换为集合2,0,4,1,3198.4.2集合操作与运算(1)集合元素增加与删除 s=1,2,3 s.add(3)#添加元素,重复元素自动忽略 s1,2,3 s.update(3,4)#更新当前字典,自动忽略重复的元素 s1,2,
13、3,4 s.discard(5)#删除元素,不存在则忽略该操作 s1,2,3,4 s.remove(5)#删除元素,不存在就抛出异常KeyError:5 s.pop()#删除并返回一个元素1208.4.2集合操作与运算(2)集合运算 a_set=set(8,9,10,11,12,13)b_set=0,1,2,3,7,8 a_set|b_set#并集0,1,2,3,7,8,9,10,11,12,13 a_set&b_set#交集8 a_set-b_set#差集9,10,11,12,13 a_set b_set#对称差集0,1,2,3,7,9,10,11,12,13218.4.2集合操作与运算 关
14、系运算符作用于集合时,表示集合包含关系,而不是元素之间的大小关系。x=1,2,3 y=1,2,5 z=1,2,3,4 x x y 1,2,3 1,3,2=3,1,2#集合中的元素是无序的True228.4.3精彩例题分析与解答 例例 5-7 快速判断两个列表中是否含有同样的唯一元素。def check(lst1,lst2):return set(lst1)=set(lst2)print(check(1,2,3,1,2,3,3,3)238.4.3精彩例题分析与解答 例例 5-8 在指定的整数范围内生成指定数量的不重复数字。import randomdef randomNumbers(number
15、,start,end):使用集合来生成number个介于start和end之间的不重复随机数 data=set()while len(data)=0.5result=filter(rule,comments)for comment in result:print(comment)258.4.3精彩例题分析与解答 例例 5-10 求解 100 以内的自然数中,能被 3 整除的自然数组成的集合 A、能被 5 整除的自然数组成的集合 B,以及能同时被 3 和 5 整除的自然数组成的集合 C。268.4.3精彩例题分析与解答A=set()B=set()for i in range(1,101):if i%3=0:A.add(i)if i%5=0:B.add(i)print(A)print(B)print(A&B)278.4.3精彩例题分析与解答 例例 5-11 已知两条直线 y=3x+5 和 y=5x-3 的交点 x 坐标值是整数并且位于区间 0,8 上。要求编写程序,使用集合运算求解这两条直线的交点坐标(x,y)。y1=set()y2=set()for x in range(0,9):y1.add(x,3*x+5)y2.add(x,5*x-3)result=(y1&y2).pop()print(result)28