彻底理解Python list切片原理
关于list的insert函数
list#insert(ind,value)在ind元素前面插入value
首先对ind进行预处理:如果ind<0,则ind+=len(a),这样一来ind就变成了正数下标
预处理之后,
当ind<0时,ind=0,相当于头部插入
当ind>len(a)时,ind=len(a),相当于尾部插入
切片实例
Python中的列表切片非常灵活,要根据表象来分析它的内在机理,这样用起来才能溜。
下标可以为负数有利有弊,好处是使用起来更简便,坏处是当我下表越界了我也不知道反倒发生奇奇怪怪的错误。
printstr[0:3]#截取第一位到第三位的字符 printstr[:]#截取字符串的全部字符 printstr[6:]#截取第七个字符到结尾 printstr[:-3]#截取从头开始到倒数第三个字符之前 printstr[2]#截取第三个字符 printstr[-1]#截取倒数第一个字符 printstr[::-1]#创造一个与原字符串顺序相反的字符串 printstr[-3:-1]#截取倒数第三位与倒数第一位之前的字符 printstr[-3:]#截取倒数第三位到结尾 printstr[:-5:-3]#逆序截取
可见,列表的下标有三个参数:beg(起始下标),end(终止下标),delta(变化量)
- 当delta小于0时,beg默认为len(array)-1,end默认为开头之前。
- 当delta大于0时,beg默认为0,end默认为最末之后。
- 当delta未给出时:delta默认为1
这个代码示例演示了大概原理,学习一件事物,先学习它的表象,然后分析它的内在实现,最后查看源代码仔细推敲它到底是怎么实现的。
需要注意的是,列表切片产生的是列表的副本,与原列表不是同一份空间。
x=[1,2,3] y=x[:] x[0]=-1 print(y)#输出[1,2,3]
列表切片写操作
接下来探究切片的写操作
>>>x=[1,2,3,4,5] >>>x[2:0]=100#在2后面插入若干个元素,应该用列表 Traceback(mostrecentcalllast): File"",line1,in TypeError:canonlyassignaniterable >>>x[2:0]=[100] >>>x [1,2,100,3,4,5] >>>delx[2:3]#删除切片 >>>x [1,2,3,4,5] >>>x[2:1]=[100]#对于切片x[from:to],会进行预处理to=max(from+1,to) >>>x [1,2,100,3,4,5] >>>delx[2:0]#对于切片del操作,如果from>to,不执行任何操作 >>>x [1,2,100,3,4,5] >>>delx[2:1] >>>x [1,2,100,3,4,5] >>>delx[2:3] >>>x [1,2,3,4,5] >>>x[2:4]=None Traceback(mostrecentcalllast): File" ",line1,in TypeError:canonlyassignaniterable >>>x[2:4]=[None] >>>x [1,2,None,5]
对列表切片进行深入理解:
defbetween(beg,end,mid): #判断mid是否位于begin和end之间 returnend>mid>=begorend=len(a)andend>=len(a):return[] #如果方向不同,则返回空列表 if(end-beg)*delta<=0:return[] #将越界的部分进行裁剪 beg=max(0,min(beg,len(a)-1)) end=max(-1,min(end,len(a))) ans=[] i=beg whilebetween(beg,end,i): ans.append(a[i]) i+=delta returnans defset_slice(a,li,beg,end,delta=1): ifdelta==0:raiseValueError("slicestepcannotbe0") ifdelta==1: #如果delta==1,那么li的长度可以随意 ifbeg<0:beg+=len(a) ifend<0:end+=len(a) beg=max(0,min(beg,len(a)-1)) end=max(-1,min(end,len(a))) foriinrange(beg,end): dela[beg] foriinreversed(li): a.insert(beg,i) else: #delta!=1,相当于替换 iflen(get_slice(a,beg,end,delta))!=len(li):raiseValueError("arraydon'tmatch") iflen(li)==0:return ifbeg<0:beg+=len(a) ifend<0:end+=len(a) beg=max(0,min(beg,len(a)-1)) #用li中的全部元素逐一替换 forind,valueinenumerate(li): a[ind*delta+beg]=value deftest_getSlice(): a=list(range(10)) importrandom foriinrange(10): beg=random.randint(-15,15) end=random.randint(-15,15) delta=0 whiledelta==0:delta=random.randint(-15,15) print(len(get_slice(a,beg,end,delta))==len(a[beg:end:delta]),beg,end,delta) deftest_setSlice(): importrandom foriinrange(10): a=list(range(10)) beg=random.randint(-15,15) end=random.randint(-15,15) delta=0 whiledelta==0:delta=random.randint(-5,5) sz=len(a[beg:end:delta]) ifdelta==1:sz=random.randint(0,4) li=[random.randint(0,100)foriinrange(sz)] set_slice(a,li,beg,end,delta) mine=a a=list(range(10)) a[beg:end:delta]=li print(a==mine) test_setSlice()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。