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

Python哈希表与解析公式_0

时间:2023-03-25 22:19:05 Python

[TOC]大家好!距离上一篇已经快一个半月了,不拖拉~,刚好这个月遇到工作调整,照顾10个月大的孩子不容易,所以一直没更新了这么久。这不,我每天敲一点代码,'滴滴成河',努力完成这篇文章。1.封装与解构1.1封装说明:等号(=)右边的多个值用逗号隔开,将封装成一个元组,称为封装打包。#示例:x=1,y=1,2print(type(x),x)print(type(y),y)#输出如下:(1,)(1,2)备注:如果右边只有一个没有逗号的值,其实是整数类型,请注意。另外,必须先运行等号右边,再赋值给左边。1.2解构说明:等号(=)右边的容器类型的元素必须对应左边用逗号隔开的变量,称为解构拆包。x,y=(1,2)#[1,2]{1,2}{'a':1,'b':2}print(x)print(y)#输出结果如下:12备注:对的容器可以是元组、列表、字典、集合等,必须是可迭代对象。错误演示:x,y=(1,2,3)print(x)print(y)#输出结果如下:ValueError:toomanyvaluestounpack(expected2)解释:左边的数字和右侧必须相同,否则将抛出“ValueError”错误。剩余变量解构说明:python3引入了剩余变量解构(rest),将剩余的数据尽可能多的收集起来,形成一个列表。x,*rest=[1,2,3,4,5,6]print(type(x),x)print(type(rest),rest)#剩下的未赋值的就是restones#输出结果如下如下:1[2,3,4,5,6]*rest,y=[1,2,3,4,5,6]print(type(rest),rest)print(type(y),y)#输出结果如下:[1,2,3,4,5]6错误示例:cannotbeusedalone说明:等号左边只有一个标识符,不能解构。*rest=[1,2,3,4,5,6]print(rest)#输出结果如下:#SyntaxErrorSyntaxError:starredassignmenttargetmustbeinalistortuplexcannotbeusedmultipletimesatthe同时,*rest1,*rest2,y=[1,2,3,4,5,6]print(rest1)print(rest2)#输出结果如下:#语法错误,一个rest带走剩下的元素,其他的休息呢?SyntaxError:twostarsedexpressionsinassignment另一个丢弃的变量下划线:'_'解释:'_'是一个合法的标识符,大多数场景表示不关注该值。x,*_,y=[1,2,3,4,5,6]print(x)print(_)print(y)#输出结果如下:1[2,3,4,5]6_,*rest,_=[1,2,3,4,5,6]print(_)#'_'为最后一次输出值print(rest)#输出结果如下:6[2,3,4,5]2。CollectionSet描述:集合是“可变的、无序的、不重复的”元素集合。成为集合元素是有条件的:'Elementsmustbehashableanditerable'可哈希对象如下(不可变):数值类型:int(整数)、float(浮点数)、complex(复数)布尔类型:True(是),false(无)string:string(字符串),bytes(字节)tuple(元组)None(空)可以通过内置的hash函数判断:s1=[1,2,3]print(hash(s1))#输出如下:TypeError:unhashabletype:'list'#Thelistisnothashable2.1初始化说明:set()->newemptysetobject,newemptysetset(iterable)->newsetobject,elements必须是可迭代的s={}#注意这是一个空字典,不是空集合s1=set()#空集合s2=set([1,2,3])#注意列表中的元素是迭代的outInteger,canbehashs3=set("abcd")print(s1)print(s2)print(s3)#输出结果如下:set(){1,2,3}{'c','d','a','b'}错误示例:s=set([[1]])#List设置列表,迭代的是列表,不是hashprint(s)#输出结果如下:TypeError:unhashabletype:'list'2.2Adds.add(element)描述:向集合中添加一个元素,如果该元素已经存在,则不执行任何操作。s1=set([1,2,3])s1.add(4)print(s1)#输出结果如下:{1,2,3,4}s.update(*element))说明:merge将一个或多个元素放入集合中,元素必须是可迭代的(将迭代后的元素合并到集合中),与后面介绍的union相同。s1=set([1,2,3])s1.update((4,5,6),[7,8,9])print(s1)#输出结果如下:{1,2,3,4,5,6,7,8,9}2.3删除remove(element)描述:从集合中删除一个元素,如果该元素不存在,抛出'KeyError'错误。s1={1,2,3,4,5,6}s1.remove(6)print(s1)#输出结果如下:{1,2,3,4,5}discard(element)说明:同样从set中移除一个元素,如果该元素不存在,则不会报异常,什么都不做。s1={1,2,3,4,5,6}s1.discard(6)print(s1)#输出结果如下:{1,2,3,4,5}pop()解释:因为集合没有顺序,所以就是删除'任意'一个元素,如果是空集合,会抛出'KeyError'错误。s1={1,2,3,4,5,6}print(s1.pop())#随机(因为无序)print(s1)#输出如下:1{2,3,4,5,6}clear()解释:不建议删除所有元素。s1={1,2,3,4,5,6}s1.clear()print(s1)#输出结果如下:set()2.4遍历说明:set是一个容器,可以遍历,但是效率为O(n)。s1={1,2,3}forsins1:print(s)#输出结果如下:123说到这里,你觉得遍历哪个更有效率,collectionset还是list列表?答案是set,因为set的元素都是hash值作为key(下面说的字典也是hash值),查询时间复杂度是O(1),而list是线性数据结构,时间复杂度为O(n)。您可以按如下方式验证。随着数据规模越来越大,哪一种效率更高就一目了然了。2.5Union&Intersection&Difference&SymmetricDifferenceUnion说明:将多个集合的所有元素组合在一起,形成一个新的集合。s1={1,2,3}s2={3,4,5}print(s1.union(s2))#输出结果如下:{1,2,3,4,5}注意:运算符可以也可以使用'|'、'update(element)'、'|='。交集说明:取多个集合的公共(交集)元素s1={1,2,3}s2={3,4,5}print(s1.intersection(s2))#输出结果如下:{3}备注:也可以使用'&'、's.intersection_update(element)'、'&='。差集解释:由属于一个集合但不属于另一个集合的元素组成的集合。s1={1,2,3}s2={3,4,5}print(s1.difference(s2))#输出结果如下:{1,2}备注:'-','s.difference_update也可以用(element)','-='。对称差集描述:多个集合之间,不属于交集元素的集合。s1={1,2,3}s2={3,4,5}print(s1.symmetric_difference(s2))#输出结果如下:{1,2,4,5}备注:也可以用'^','s1.symmetric_difference_update(s2)','^='.3。字典说明:字典是任意项(元素)的集合,项是由键值对组成的二元组。字典是“可变的”:支持增删改查;字典是“无序的”:密钥存储是无序的,非线性数据结构(请不要被表面所迷惑);字典是“键不重复”:键是唯一的,必须是“可散列的”;3.1初始化#空字典d1={}d2=dict()#示例:d3=dict(a=1,b=2,c=3)d4=dict(d3)d5=dict([('a',1),('b',2),('c',3)])#元素必须是可迭代的d6={'a':1,'b':2,'c':3}#输出结果为all:{'a':1,'b':2,'c':3}3.2增删改查元素增删改1)通过'd[key]=value'方法:备注:如果key不存在则添加,key存在则直接覆盖(修改元素)。#添加和修改d={'a':1,'b':2,'c':3}d['d']=4#添加d['a']=11#修改print(d)#输出如下:{'a':11,'b':2,'c':3,'d':4}2)Add&viad.update([E,]**F)->None#修改d={'a':1,'b':2,'c':3}d.update(d=4)print(d)#输出如下:{'a':1,'b':2,'c':3,'d':4}删除元素1)如果d.pop()key存在,则删除,返回对应的值。如果key不存在,返回给定的默认值,否则抛出KeyError。d={'a':1,'b':2,'c':3}print(d.pop('c',None))print(d)#输出结果如下:3{'a':1,'b':2}2)d.popitem()删除并返回任意项(键:值)。如果它是空字典,则会引发KeyError。d={'a':1,'b':2,'c':3}print(d.popitem())print(d)#输出结果如下:('c',3){'a':1,'b':2}3)d.clear()删除所有项,不推荐。d={'a':1,'b':2,'c':3}d.clear()print(d)查找元素可以通过key快速找到value。时间复杂度为O(1),不会随着数据量的增加而降低效率。正常获取元素:d={'a':1,'b':2,'c':3}print(d['a'])print(d.get('b'))#输出结果如下:12key不存在的处理方法:d={'a':1,'b':2,'c':3}print(d.get('d',None))#如果key不存在,默认returnNoneprint(d.setdefault('d',100))#如果key不存在,添加key:valuepairprint(d)#输出如下:None100{'a':1,'b':2,'c':3,'d':100}3.3遍历遍历keys:keyd={'a':1,'b':2,'c':3}#方法1:forkind:#默认为遍历键print(k)#方法二:forkind.keys():print(k)#方法三:fork,_ind.items():print(k)#输出结果如下:abc遍历值:valued={'a':1,'b':2,'c':3}#方法一:forvind.values():print(v)#方法二:forkind:#print(d[k])#你也可以使用print(d.get(k))#方法三:for_,vind.items():print(v)#输出结果如下:123traverseitem:key-valued={'a':1,'b':2,'c':3}foritemind.items():print(item)#输出是如下:('a',1)('b',2)('c',3)其他问题这种情况下,遍历的时候,不能删除元素,也不能改变字典的大小。d={'a':1,'b':2,'c':3}forkind:print(d.pop(k))#输出如下:RuntimeError:dictionarychangedsizeduringiteration优雅删除方法:d={'a':1,'b':2,'c':3}key_list=[]forkind:key_list.append(k)forkinkey_list:print('Deletedkey:',d.pop(k))不是彩蛋,如果要清空直接用clear()即可。4.解析和生成器表达式4.1列表推导语法[returnvalueforelementiniterableobjectifcondition]列表推导使用方括号'[]'返回一个新的列表优点提高效率代码轻巧可读高质量示例要求:请从给定区间中提取可被2整除的元素。常用写法:list=[]foriinrange(10):ifi%2==0:list.append(i)print(list)#输出结果如下:[0,2,4,6,8]再感受一下简洁优雅的写法:print([iforiinrange(10)ifi%2==0])#输出结果如下:[0,2,4,6,8]以上是列表推导公式也叫列表下推公式。4.2生成器表达式语法(returnvalueforelementiniterableobjectifcondition)生成器表达式使用方括号'()'表示返回一个生成器对象(generator)特点:按需计算,即当需要一个值时才返回计算(而列表分析公式是一次性计算,立即返回所有结果)前期不占内存,最后取更多的值,和列表分析公式一样;计算时间极短,不返回结果。是一个生成器对象;看看生成器对象长什么样子(别以为是元组分析,哈哈):x=(iforiinrange(10)ifi%2==0)print(type(x))print(x)#输出结果如下:#Generatorat0x000001A143ACBA98>#Generatorobjectgenerator对象如何计算结果:importtimex=(iforiinrange(10)ifi%2==0)foriinrange(6):#只有一个循环time.sleep(0.5)print(next(x))time.sleep(1)print(next(x))#for循环有计算了所有的结果,取不到值,所以抛出异常。#输出结果如下:02468StopIteration#已经超出可迭代范围,抛出异常。备注:生成器表达式只能迭代一次。4.3集合分析公式集合分析公式与列表推导式类似,没有过多的分析。语法:{returnvalueforelementiniterableobjectifcondition}set解析公式使用花括号'{}'返回一个集合例子:print({iforiinrange(10)ifi%2==0})#输出结果如下:{0,2,4,6,8}4.4字典分析字典分析和集合分析语法相似,不做过多分析。语法:{key:valueforelementiniterableobjectifcondition}字典分析使用花括号'{}'返回一个字典示例:print({i:(i+1)foriinrange(10)ifi%2==0})#输出结果如下:{0:1,2:3,4:5,6:7,8:9}一般来说,如果写出解析式,很容易理解和理解高效,强烈推荐大家使用。但是有些场景写起来很复杂,所以还是得用for...in循环拆分来写。如果喜欢我的文章,欢迎关注我的公众号:滴滴科技,扫码关注,不定时分享