当前位置: 首页 > 后端技术 > Python

#振振小手学Python#说完列表再说字典,说完字典再说集合

时间:2023-03-25 21:07:58 Python

字典和集合。为什么字典和收藏总是在一起?很巧的是,他们都用花括号{}包。字典和集合的基本操作先说字典是由键值对组成的。键是Key,值是Value。标记它。Python3.6之前不需要字典,可以改变长度和大小,也可以任意删除元素。并且改变了,在Python3.7之后,字典被排序了。为了测试字典的无序性,我特地在Python在线环境下进行了测试。代码如下:my_dict={}my_dict["A"]="A"my_dict["B"]="B"my_dict["C"]="C"my_dict["D"]="D"forkeyinmy_dict:print(key)的结果也证明了乱序。在本地Python3.8版本上测试,没有乱码。所以如果有人问Python里面字典有没有顺序,不要只回答没顺序,这东西现在有顺序了。字典的键值对结构相对于列表和元组更适用于添加元素、删除元素、查找元素等操作。字典的创建不详述。雪球第一时间得知,就已经介入了。需要注意的是,在索引key的时候,如果key不存在,会出现KeyError错误。这个错误是一个极其常见的错误。my_dict={}my_dict["A"]="A"my_dict["B"]="B"my_dict["C"]="C"my_dict["D"]="D"print(my_dict["F"])错误信息如下:Traceback(mostrecentcalllast):File".\demo.py",line7,inprint(my_dict["F"])KeyError:'F'Ifyou不想在这个异常发生的时候,在索引key的时候使用get(key,default)函数。print(my_dict.get("F","None"))下面说一下集合和字典的基本结构。最大的区别是集合没有键值对,它们是一系列无序且唯一的元素组合。集合不支持索引操作,也就是说下面的代码肯定会报错。my_set={"A","B","C"}print(my_set[0])异常提示是类型错误:TypeError:'set'objectisnotsubscriptable。剩下的重点记忆就是collection在去重操作中经常用到,掌握就好。字典和集合排序的基本操作还是不过多解释。有需要的可以第一时间去学滚雪球。这里着重强调排序功能,因为涉及到一些扩展的知识点,大家可以先联系,后面会详细讲解其中的一些内容。在学习之前,你要记住对集合的弹出操作会得到不确定的元素,因为集合是无序的。具体可以测试如下代码:my_set={"A","B","C"}print(my_set.pop())如果要对字典进行排序,可以按照我们已知的技术进行。以下内容为Python3.6以下版本运行结果。直接使用sorted函数对字典进行排序。排序时,也可以指定按key或value排序,比如按字典值升序排序。my_dict={}my_dict["A"]="4"my_dict["B"]="3"my_dict["C"]="2"my_dict["D"]="1"sorted_dict=sorted(my_dict.items(),key=lambdax:x[1])print(sorted_dict)输出结果如下,得到的结果按照字典的值排序,这里需要注意的是lambda匿名函数会在后续课程中逐渐扩展[('D','1'),('C','2'),('B','3'),('A','4')]特别说明,直接使用sorted函数即可。字典和集合的效率字典和集合的效率主要是和列表比较的。假设有一堆学生人数和体重数据,我们需要确定不同体重的学生人数。需求描述如下:有4个学生,对学号排序形成的元组为(1,90),(2,90),(3,60),(4,100),最终结果输出为3(有3个不同的weight)按照要求写代码如下:Listwritingdeffind_unique_weight(students):#声明一个统计列表unique_list=[]#循环遍历所有学生数据forid,weightinstudents:#iftheweightisnotinthestatisticallistifweightnotinunique_list:#添加新的权重数据unique_list.append(weight)#计算列表长度ret=len(unique_list)returnretstudents=[(1,90),(2,90),(3,60),(4,100)]print(find_unique_weight(students))接下来将上面的代码改为set写法deffind_unique_weight(students):#声明一个统计集合unique_set=set()#循环所有studentdataforid,weightinstudents:#set会自动过滤重复数据unique_set.add(weight)#计算集合长度ret=len(unique_set)returnret代码写完后,没有太大区别,但是如果数据扩展到两个更大的集合,比如几万条数据。下面的代码时间计算函数使用time.perf_counter()函数,第一次调用时,从计算机系统中随机选择一个时间点A,计算从当前时间点B1算起的秒数。第二次调用该函数时,默认为当前时间点B2距离第一次调用时间点A的秒数。取两个函数的区别,即实现时间点B1到B2的计时功能,首先结合list计算的功能,运行如下代码importtimeid=[xforxinrange(1,10000)]#权重数据的计算,只能从1到10000weight=[xforxinrange(1,10000)]students=list(zip(id,weight))start_time=time.perf_counter()#调用列表计算函数find_unique_weight(students)end_time=time.perf_counter()print("Operationtimeis:{}".format(end_time-start_time))运行时间为1.7326523,各台电脑运行速度不一致,详情请见差异。修改以上代码,在集合编写的函数上运行,最终结果为0.0030606。可以看出,在10000条数据级别就已经出现了这么大的差异。如果数量级增加,差异将再次增加。所以你知道要使用什么内容吗?本篇博客总结本篇博客补充了字典和集合相关的知识,还有一个知识橡皮擦还是跳过了,就是字典和集合的存储原理,具体会涉及到哈希表结构相关的知识,这部分对初级应用影响不大,暂时跳过。对于字典和集合,如果在编写程序中需要高效查找数据和去重数据,建议及时应用两者。