Python3列表删除的三种方式实现
作者:hello-alien 发布时间:2021-03-26 17:55:55
1. 删除列表(list)的三种方式
(1).按照元素删除—remove()
直接删除具体某个元素,remove里面传递的是元素的值
从最左边开始寻找第一个符合要求的元素
remove函数没有结果返回
如果没有对应的元素,则抛出错误
my_list = [1, 2, 3, 4, 2, 5]
my_list.remove(2)
print(my_list)
# 结果
[1, 3, 4, 2, 5]
my_list = [1, 2, 3, 4, 2, 5]
my_list.remove(6)# 没有元素6,最终会抛出异常
print(my_list)
# 结果
Traceback (most recent call last):
File "/Users/alien_test.py", line 58, in <module>
my_list.remove(6)
ValueError: list.remove(x): x not in list
(2).按照索引删除—pop()
根据索引删除某个元素
pop执行完会返回对应元素的值
pip()中如果不传递索引,则删除最后一位元素
pop删除的索引,如果越界会抛出异常
# 根据索引删除元素
my_list = [1, 2, 3, 4, 2, 5]
item = my_list.pop(1)
print(my_list)
print(item)
# 结果
[1, 3, 4, 2, 5]
2# 元素2是对应索引为1的值
# 删除最后一个元素
my_list = [1, 2, 3, 4, 2, 5]
item = my_list.pop()
print(my_list)
print(item)
# 最终结果
[1, 2, 3, 4, 2]
5
# 越界抛出异常
my_list = [1, 2, 3, 4, 2, 5]
item = my_list.pop(8)
print(my_list)
print(item)
# 结果
Traceback (most recent call last):
File "/Users/test/alien_test.py", line 58, in <module>
item = my_list.pop(8)
IndexError: pop index out of range
(3).按照索引删除—del()
根据索引删除,最终结果没有返回值
索引越界抛出异常
my_list = [1, 2, 3, 4, 2, 5]
del my_list[1] #等同于 del(my_list[1])
print(my_list)
# 结果
[1, 3, 4, 2, 5]
my_list = [1, 2, 3, 4, 2, 5]
del my_list[8]
print(my_list)
# 异常结果
Traceback (most recent call last):
File "/Users/test/alien_test.py", line 58, in <module>
del my_list[8]
IndexError: list assignment index out of range
2. 删除元素引发的思考
(1).事故发生现场
【case 1:】
my_list = [1, 2, 2, 3, 2]
for item in my_list:
if item == 2:
my_list.remove(item)
print(my_list)
# [1, 3, 2]
【case 2:】
my_list = [1, 2, 2, 3, 2]
for index in range(len(my_list)):
if my_list[index] == 2:
my_list.pop(index)
print(my_list)
# 结果
Traceback (most recent call last):
File "/Users/test/alien_test.py", line 59, in <module>
if my_list[index] == 2:
IndexError: list index out of range
(2).列表----正序遍历的过程分析
my_list = [1, 2, 2, 3, 2]
for item in my_list:
print("item-------->", item)
if item == 2:
my_list.remove(item)
print(my_list)
# 结果:
item--------> 1
item--------> 2
item--------> 3
item--------> 2
[1, 3, 2]
【分析过程:】
如上过程,发现for循环的过程居然没有遍历所有的元素,打印的结果少一个索引位置为2的元素2
具体原因是,for循环的时候,列表的元素是动态变化的。具体可参考如下过程
step1:列表的遍历过程如下
列表的遍历是通过游标来控制列表的位置,从索引为0号位一直到最后一个位置,依次遍历
step2:列表的删除某个元素流程如下
当遍历到索引为1的位置时候,准备删除这个位置元素
删除完index=1这个元素之后,紧接着index=2的元素会向左移动到原始index=1的位置。此时,游标已经在index=1的位置。
下一次再遍历的时候,游标会自增1,变为从index=2开始。而此时index=2的元素是3,跳过了原始的index=2的元素2。
所以,如果有连续的相同的元素2,则会少遍历一次这个元素。如上2个案例,都是这个原因导致的问题。
(3).列表----倒序遍历的过程分析
my_list = [1, 2, 2, 3, 2]
for index in range(len(my_list) - 1, -1, -1):
item = my_list[index]
print("item-------->", index, "--->", item)
if item == 2:
my_list.pop(index)
print(my_list)
# 结果
item--------> 4 ---> 2
item--------> 3 ---> 3
item--------> 2 ---> 2
item--------> 1 ---> 2
item--------> 0 ---> 1
[1, 3]
1.通过倒序的遍历,可以把所有的2元素都删除了,倒序为什么能解决如上的问题?
2.倒序也会出现删除的元素的位置,被新元素占用的情况?
step1:列表倒序的遍历过程如下
step2:列表的删除某个元素流程如下
当遍历到索引为4的位置时候,准备删除这个位置元素
删除完索引index=4的元素之后
下一个遍历的索引是index=3,此时游标在index=3的位置,从元素3开始再遍历
当删除index=2的元素2的时候,因为这个元素前面的所有索引的位置都没有变动,所以再下一次,还能遍历到index=1的第一个2
最终,倒序最大的优势是,从后往前遍历,而前面所有元素的索引是没有变动的,固后续的遍历过程没有受是否删除元素的影响。这个是倒序最核心的优势!!!
3. 删除列表中重复的元素
(1).根据索引删除—(如上倒序的方式)
my_list = [1, 2, 2, 3, 2]
for index in range(len(my_list) - 1, -1, -1):
item = my_list[index]
print("item-------->", index, "--->", item)
if item == 2:
my_list.pop(index)
print(my_list)
(2).根据元素删除—(结果正确,但是过程是错误)
my_list = [1, 2, 2, 3, 2]
for index in range(len(my_list) - 1, -1, -1):
item = my_list[index]
print("item-------->", index, "--->", item)
if item == 2:
my_list.remove(item)
print("--->", my_list)
print(my_list)
# 结果
item--------> 4 ---> 2
---> [1, 2, 3, 2]# 此处倒序遍历,其实删除的是从左向右的第一个元素2
item--------> 3 ---> 2
---> [1, 3, 2]# 此除遍历的是第二个2,删除的也是第二个元素
item--------> 2 ---> 2
---> [1, 3]# 次数遍历的是最后一个2,删除的也是这个元素
item--------> 1 ---> 3
item--------> 0 ---> 1
[1, 3]
如上的方式不好的地方是:
倒序遍历了,但是最终删除的元素是从左向右排序的元素。如果出现多个相同的元素,则删除的不是当前遍历到的元素。
次方法, 慎重使用!!!
来源:https://hello-alien.blog.csdn.net/article/details/123737262


猜你喜欢
- Bootstrap,来自 Twitter,是目前最受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的,
- 1.数据准备#1.建立员工表,并创建name,age,position索引,id为自增主键CREATE TABLE `employees`
- 一、包的导入Golang 当导入多个包时,一般按照字母顺序排列包名称,像Goland 等IDE 会在保存文件时自动完成这个动作。Golang
- SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研
- 导语:谷歌浏览器中有个很有名的彩蛋:当你网络出现问题时,就会出现一个“小恐龙游戏”。🦖相信很多人都玩过 chrome 上提供的恐龙跑跑游戏,
- 1. 模块介绍1. bisect模块为内置标准库,它实现了二分法查找算法(只要提到二分法查找,应该优先想到此模块)2. 主要包含有两个函数:
- 1. 概述在看代码的时候发现基本上都是用 querySelector() 和 querySelectorAll() 来获取元素,疑惑为什么不
- 前言列表(list)同字符串一样都是有序的,因为他们都可以通过切片和索引进行数据访问,且列表是可变的。创建列表的几种方法第一种name_li
- 当我们建立一个数据库时,并且想将分散在各处的不同类型的数据库分类汇总在这个新建的数据库中时,尤其是在进行数据检验、净化和转换时,将会面临很大
- 我们平日办公时用得最多的软件是Execl、Word或WPS Office等,你的计算机中一定储存着大量的XLS、DOC、WPS文件吧!网页制
- CLI工程全局安装vue-clinpm install -g @vue/cli通过cli创建uni-app项目 vue creat
- [mysql]replace的用法(替换某字段部分内容)[mysql]replace的用法1.replace into  
- 如下所示:# -*- coding: utf-8 -*-from __future__ import unicode_literalsfro
- ff默认不让改 statusopera9 测试通过ie6 测试通过这东西是给统计部门用的,分析用户习惯以改良网站布局
- 本文实例为大家分享了TensorFlow实现Logistic回归的具体代码,供大家参考,具体内容如下1.导入模块import numpy a
- 1.Python 程序from flask import Flaskapp = Flask(__name__)@app.route('
- 大型网站为了缓解大量的并发访问,除了在网站实现分布式负载均衡,还会搭建服务器mysql集群技术,来分担主数据库的压力。在本地电脑能实现这样的
- What do the ->, => and :: symbols mean?The -> is the "in
- 下载git客户端 FileàDefault Settingà Version Controlà GitPath to Git ex
- Pandas库十分强大,但是对于切片操作iloc, loc和ix,很多人对此十分迷惑,因此本篇博客利用例子来说明这3者之一的区别和联系,尤其