修改列表
一、通过索引来修改
修改元素
#创建一个列表
stus =
['孙悟空','猪八戒','沙和尚','唐僧','蜘蛛精','白骨精']
print("修改前:",stus)
#修改列表中的元素
#直接通过索引来修改元素
stus[0] = 'sunwukong'
print('修改后:',stus)
程序执行结果为:
可以看到第一个元素被修改了。
之前我们说过对于不可变对象可以通过改变量、给变量重新赋值的方式来修改,但是注意并没有改变对象本身,在这里也是通过索引修改了里面的元素,也就是说这个变量没有变,我们只是修改了这个量的值。
通过del来删除元素
如果我们想删除一个变量,可以通过del来实现,比如要删除索引为2的变量,可添加如下代码:
del stus[2] #删除索引为2的元素
执行结果为:
可以看到“沙和尚”这个元素就不见了。
二、通过切片来修改列表
#创建一个列表
stus =
['孙悟空','猪八戒','沙和尚','唐僧','蜘蛛精','白骨精']
print("修改前:",stus)
#通过切片来修改列表中的元素
stus[0:2] = ['swk']
print('修改后:',stus)
执行结果为:
可以看到在这里“孙悟空”和“猪八戒”就变成了swk。
但是因为字符串本身也是一种序列,所以看不到明显的效果,我们使用数字来试试!
stus[0:2] =123
执行结果为:
可以看到,程序报错了。这是因为我们在给切片赋值的时候必须传递一个序列。切片返回的就是一个序列,所以我们必须赋值给它一个序列去替换原本的序列。
所以正确的赋值方式展示如下:
#使用新的元素替换旧元素
stus[0:2] = ['牛魔王','红孩儿']
执行结果为:
可以看到“孙悟空”和“猪八戒”就被替换掉了。
思考: 如果我们传递了多个元素呢?
stus[0:2] = ['牛魔王','红孩儿','二郎神']
执行结果为:
可以看到“孙悟空”和“猪八戒”被这三个元素给替换了。
接下来再看一种情况:
stus[0:0] = ['牛魔王'] #向索引为0的位置插入元素
首先来回忆一下,切片包括的范围是包括开始不包括结束位置。那这里的“0:0”不包括任何元素。
执行结果为:
可以看到“牛魔王”在“孙悟空”的前面,代表在索引为0的位置插入元素。可以采用这种写法。
接下来再介绍一种有步长的:
stus[::2] = ['牛魔王']
执行结果为:
可以看到,程序报错了。人家想要的是三个元素,你却只给了一个元素。
这里要注意:当设置了步长时,序列中元素的个数必须和切片中元素的个数一致。
重新设置下:
stus[::2] = ['牛魔王','红孩儿','二郎神']
执行结果为:
可以看到从开始位置每隔步长为2的位置替换了新的元素。
通过切片来删除元素
del stus[0:2]
执行结果为:
可以看到前两个元素就被删掉了。
还可以选择有步长的切片。
del stus[::2]
执行结果为:
可以看到,切片位置的元素就被删除了。
还有一种用法:
stus[1:3] = []
执行结果为:
可以看到,从索引1位置到3位置的元素就被删除了。
以上山寨版红方式都可以进行删除,使用del或者赋值为空都是可以的。
但是注意以上操作,只适用于可变序列。下面举例子说明:
s = 'hello'
s[1] = 'a' #不可变序列,无法通过索引来修改
#这种写法代码会报错
但是可以通过 list() 函数将其他的序列转换为list:
s = 'hello'
s = list(s)
print(s)
执行结果为:
可以看到这样是可以进行修改的,但此时它已经不是一个字符串了。