Python-对于列表的删除方法大总结

标题对于一个列表 x = [1, 2, 4, 5, 8, 9, 4] , 大家来想一想列表的删除方法有哪些呢?

  • 本博客分别从del x[:]remove()pop() 来说起!!
1. 首先大家就能想到的就是:del , 因为 删除 的英文就是 delete
x = [1, 2, 4, 5, 8, 9, 4]
print(id(x))
# 删除 2 试一试,是索引 2 对应的元素呢,还是就是数字 2 ?
del x[2]
# 再次打印地址试试
print(id(x))
# 打印此时的列表 x
print(x)

运行结果如下:

140174853529224
140174853529224
[1, 2, 5, 8, 9, 4]
  • 大家发现, 地址没有变化, 说明 del x[2] 的操作并没有重新创建对象(PS: Python 中,一切皆对象!!), 细心的小伙伴们也发现了,del x[2] 的操作并不是删除列表中的数字 2 ,而是列表索引 2 对应的数字 4。
  • 地址没有发生变化, 说明 del x[2]原地操作 , 没有听过的小伙伴们可能会蒙圈。

好奇的小伙伴又问了,如果删除的索引不存在,程序会发生什么呢?

下面我们根据实例,看看会有哪些情况

x = [1, 2, 4, 5, 8, 9, 4]
print(id(x))
# 删除的是不是 9 呢?
del x[9]
# 再次打印地址试试
print(id(x))
# 打印此时的列表 x
print(x)

运行结果如下:

IndexError: list assignment index out of range
  • 这里程序提示报错了:意思是列表访问索引超出的范围,因为这篇文章 x 的列表就 7 个元素,索引是从 0 开始的那么索引最多到 6
# 索引 0  1  2  3  4  5  6 # 这是正向索引:正向递增
x =  [1, 2, 4, 5, 8, 9, 4]
#    -7 -6 -5 -4 -3 -2 -1 # 这是反向索引:负向递减

del 就这一种方法嘛 ~ ,还有没有其他方法呢?
del 还可以删除整个列表哦 ~ 一起来动动手吧!

x = [1, 2, 4, 5, 8, 9, 4]
print(id(x))
# 删除整个列表
del x
# 再次打印地址试试
print(id(x))
print(x)

运行结果如下:

140174853849224
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-221-785a7e852cc8> in <module>
      4 del x
      5 # 再次打印地址试试
----> 6 print(id(x))

NameError: name 'x' is not defined
  • 我们发现程序报错的,错在第 6 行, NameError: name 'x' is not defined ,程序它说:亲 ~ ,您刚刚删了已经把我从这个世界上 湮灭 了 (就像是复联中的灭霸,弹指灰飞烟灭~),怎么可能找到我的家( id(x) )呢??
  • 没错 , 此时 del x 操作已经删除了整个列表 ,程序已经找不到了。

这时就会有小伙伴们问了 ,是不是该介绍介绍 remove() 方法了呢 ?

del x[:] 站出来不愿意了,大喊,劳资还有功能呢,其他人闪开!

del x[start:stop] 还可以删除指定的 区域 ,例如:

x = [1, 2, 4, 5, 8, 9, 4]
print(id(x))
# 删除 索引 2 到索引 4 ?还是 ?
del x[2:4]
# 再次打印地址试试
print(id(x))
print(x)

运行结果如下:

140174855737032
140174855737032
[1, 2, 8, 9, 4]
  • 细心的小伙伴们会发现,del x[2:5] 的操作并不是删除是删除索引 2、3 对应的元素,有小伙伴就问了,不对,还有索引 4 呢。我们看:
# 索引 0  1  2  3  4  5  6 # 这是正向索引:正向递增
x =  [1, 2, 4, 5, 8, 9, 4]
#    -7 -6 -5 -4 -3 -2 -1 # 这是反向索引:负向递减
  • 索引这部分是个好知识点, 包括 range() 、 字符串的 slice (切片等等都会涉及到,后面会一 一讲解。)

  • del x[2:5] 果然删除的是 2 ,3 索引的元素(数字 4 和 5),小伙伴们又发现了, 没有包括索引 4 ,这里就可以小结一下了:一般的 [start:stop] 是左闭右开的
    start :索引开始的位置 (包含)
    stop : 索引结束的位置 (不包含)

  • 当然,如果删除的索引也超出了范围,程序是否也会报错呢?

下面我们根据实例,看看会有哪些情况

x = [1, 2, 4, 5, 8, 9, 4]
print(id(x))
del x[2:9]
# 再次打印地址试试
print(id(x))
# 打印此时的列表 x
print(x)

运行结果如下:

140174854780872
140174854780872
[1, 2]
  • 大家发现如果索引结束位置超出了列表长度,程序不但没有报错,反而打印了剩余列表,这是为什么呢?
  • 可能是因为列表会默认 删除 开始索引位置 到索引末端
# 索引 0  1  # 这是正向索引:正向递增
x =  [1, 2]
#    -2 -1  # 这是反向索引:负向递减

到这里,基本就讲完了 del 的用法

2. 下面我们来介绍一下 x.remove() 的方法吧 ~~

先上代码:

x = [1, 2, 4, 5, 8, 9, 4]
print(id(x))
# 删除所有的 4 ,还是?
x.remove(4)
# 再次打印地址试试
print(id(x))
print(x)

运行结果如下:

140174908666248
140174908666248
[1, 2, 5, 8, 9, 4]
  • 大家会发现 :第一个数字 4 没有了, 说明用 x.remove(4) 方法删除了, 小伙伴们一起来和我想一想,remove() 括号里的参数是 —— 非常棒, 就是 待删除的元素 ,而不是按照索引删除的。
  • 大家还能发现,remove() 方法对列表进行删除操作和 del 删除操作一样,相同点 都是原地修改,不同点 del 是按照索引删除的,而remove 是直接删除的是第一次出现的元素。
  • 同理,remove() 方法删除的元素不存在,是否会报错呢?
x.remove(7)
print(x)

运行结果如下:

ValueError: list.remove(x): x not in list
  • 程序报错,说 x 元素不在列表中 (这里的 x 指的是 7 )

当然你什么都不放,程序也会生气气~:

x.remove()

运行结果如下:

TypeError: remove() takes exactly one argument (0 given)
  • 程序说:哼,明明应该给我一颗糖糖,如今什么都不给 ,生气啦生气啦~
3. 最后,我们一起来看一下 x.pop() 的用法吧 ~~
x = [1, 2, 4, 5, 8, 9, 4]
print(id(x))
# 没有参数,会不会报错 ?
x.pop()
# 再次打印地址试试
print(id(x))
print(x)
  • 这时小伙伴就问了,唉,小白,你什么参数都没传进去,程序要报错啊!!
  • 真的是这样吗?

运行结果如下:

140174854446280
140174854446280
[1, 2, 4, 5, 8, 9]
  • 聪明的小伙伴们擦亮眼睛看看哪一个元素少了?
  • 这时有小伙伴就开始抢答了,最后一个数字没有了 ! 细心的小伙伴也发现了, pop() 也是原地修改
  • 于是就有小伙伴问了,咦,小白,那你说的这删除方法和 remove() 一样啊,没有啥区别啊。
  • 别急,重点来了
x = [1, 2, 4, 5, 8, 9, 4]
print(x.pop())
print(x)

运行结果如下:

4
[1, 2, 4, 5, 8, 9]
  • 大家会发现,这个删掉的元素 4 又被 x.pop() 抛出来了

那如果传入参数呢?

x = [1, 2, 4, 5, 8, 9, 4]
print(x.pop(4))
print(x)
  • 想一下 x.pop(4) 删的是索引对应的元素,还是就是删除的是数字 4 ?

运行结果如下:

8
[1, 2, 4, 5, 9, 4]
  • 看来啊,x.pop(4) 方法删除的是指定索引的元素,即 数字 8

那如果打印 x.remove(7) 这个呢 ?

x = [1, 2, 4, 5, 8, 9, 4]
print(x.remove(5))
print(x)

运行结果如下:

None
[1, 2, 4, 8, 9, 4]
  • 返回值为 None
文字小结:
  • 由此就可以小结一下, x.pop() 方法是删除某个元素并抛出, x.remove() 是悄悄的删。
  • 可以做这样一个类比 x.pop() 是光明正大的删,大喊我把某个东西偷了,并且还亮了出来到处炫耀。而 x.remove() 是偷偷的删人家还不知道( None ),默默无闻。
表格小结:
方法del xdel x[:]x.remove()x.pop()
删除原则整体删除按索引按元素按索引
修改方式地址“消失”原地修改原地修改原地修改
若元素不存在————报错——
若索引不存在——————报错
不传参数——清空列表元素报错默认删除末尾
返回值——返回 [ ]None返回删除的元素
传参数彻底删除列表删除指定区间,若超出,默认删除末尾删除第一次指定的元素按索引删除并返回
返回值————None返回删除的元素
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗的_小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值