彻底理解Python切片 关于list的insert函数

来源:互联网 发布:淘宝蛋糕店排名 编辑:程序博客网 时间:2024/06/06 20:44

关于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中的列表切片非常灵活,要根据表象来分析它的内在机理,这样用起来才能溜。
下标可以为负数有利有弊,好处是使用起来更简便,坏处是当我下表越界了我也不知道反倒发生奇奇怪怪的错误。

print str[0:3] #截取第一位到第三位的字符print str[:] #截取字符串的全部字符print str[6:] #截取第七个字符到结尾print str[:-3] #截取从头开始到倒数第三个字符之前print str[2] #截取第三个字符print str[-1] #截取倒数第一个字符print str[::-1] #创造一个与原字符串顺序相反的字符串print str[-3:-1] #截取倒数第三位与倒数第一位之前的字符print str[-3:] #截取倒数第三位到结尾print str[:-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]=-1print(y) #输出[1,2,3]

列表切片写操作

接下来探究切片的写操作

>>> x=[1,2,3,4,5]>>> x[2:0]=100     #在2后面插入若干个元素,应该用列表Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: can only assign an iterable>>> x[2:0]=[100]>>> x[1, 2, 100, 3, 4, 5]>>> del x[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]>>> del x[2:0]     #对于切片del操作,如果from>to,不执行任何操作>>> x[1, 2, 100, 3, 4, 5]>>> del x[2:1]>>> x[1, 2, 100, 3, 4, 5]>>> del x[2:3]>>> x[1, 2, 3, 4, 5]>>> x[2:4]=NoneTraceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: can only assign an iterable>>> x[2:4]=[None]>>> x[1, 2, None, 5]

对列表切片进行深入理解:

def between(beg, end, mid):    # 判断mid是否位于begin和end之间    return end > mid >= beg or end < mid <= begdef get_slice(a, beg, end, delta=1):    # 数组切片get方式    if delta == 0: raise ValueError("slice step cannot be 0")    # 将负数下标转化一下    if beg < 0: beg += len(a)    if end < 0: end += len(a)    # 如果转化完成之后依然不在合法范围内,则返回空列表    if beg < 0 and end < 0 or beg >= len(a) and end >= 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    while between(beg, end, i):        ans.append(a[i])        i += delta    return ansdef set_slice(a, li, beg, end, delta=1):    if delta == 0: raise ValueError("slice step cannot be 0")    if delta == 1:        # 如果delta==1,那么li的长度可以随意        if beg < 0: beg += len(a)        if end < 0: end += len(a)        beg = max(0, min(beg, len(a) - 1))        end = max(-1, min(end, len(a)))        for i in range(beg, end):            del a[beg]        for i in reversed(li):            a.insert(beg, i)    else:        # delta!=1,相当于替换        if len(get_slice(a, beg, end, delta)) != len(li): raise ValueError("array don't match")        if len(li) == 0: return        if beg < 0: beg += len(a)        if end < 0: end += len(a)        beg = max(0, min(beg, len(a) - 1))        # 用li中的全部元素逐一替换        for ind, value in enumerate(li):            a[ind * delta + beg] = valuedef test_getSlice():    a = list(range(10))    import random    for i in range(10):        beg = random.randint(-15, 15)        end = random.randint(-15, 15)        delta = 0        while delta == 0: delta = random.randint(-15, 15)        print(len(get_slice(a, beg, end, delta)) == len(a[beg:end:delta]), beg, end, delta)def test_setSlice():    import random    for i in range(10):        a = list(range(10))        beg = random.randint(-15, 15)        end = random.randint(-15, 15)        delta = 0        while delta == 0: delta = random.randint(-5, 5)        sz = len(a[beg:end:delta])        if delta == 1: sz = random.randint(0, 4)        li = [random.randint(0, 100) for i in range(sz)]        set_slice(a, li, beg, end, delta)        mine = a        a = list(range(10))        a[beg:end:delta] = li        print(a == mine)test_setSlice()
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩刚上幼儿园哭闹怎么办 一到冬天皮肤痒怎么办 87岁老人身上痒怎么办 天刀技能拖不动怎么办 晚上不吃饭饿了怎么办 虚火引起的牙疼怎么办 吃上火了牙疼怎么办 慢性胃炎引起的口臭怎么办 烂牙引起的口臭怎么办 坏牙引起的口臭怎么办 牙齿拔了有口臭怎么办 胃疼连着后背疼怎么办 肚脐眼又红又痒怎么办 三岁宝宝有口臭怎么办 脚扭了按压疼痛怎么办 喝完酒头晕5天了怎么办 三岁宝宝口气重怎么办 肠镜检查出息肉怎么办 怀孕了口气很重怎么办 脚被重物压肿了怎么办 摔倒膝盖肿了应该怎么办 脚挤压伤肿了怎么办 30岁后脸上长斑怎么办 12岁脸上有雀斑怎么办 16岁脸上有斑怎么办 脸上有斑怎么办 教你 4o岁脸上有色斑怎么办 小孩三年级成绩都差怎么办 孕晚期头大腿短怎么办 天天p图格式不对怎么办 橡胶枕头太高了怎么办 信用卡多存的钱怎么办 异地三险离职了怎么办 不小心吃了沥青怎么办 快递爆仓怎么办怎么分 爱养成4酒二借钱怎么办 村里的非农户口怎么办 炖排骨肉老发硬怎么办 u盾密码忘了怎么办 创维电视不清晰怎么办 电视的屏幕裂了怎么办