Python中遍历列表remove漏删解决方案

简介: 我有一个需求:保留list_1中含有list_2元素的元素,其他的删除

@[toc]

需求及背景

我有一个需求:保留list_1中含有list_2元素的元素,其他的删除

list_1 = ['魁哥','夭夭', '阿离', '渣姐', '秃头企鹅', '王哥', '小白', '卷魔']
list_2 = ['旺仔', '秃头企鹅', '王哥']

最后需要输出

['秃头企鹅', '王哥']

直接一顿操作,写出了如下代码

for i in list_1:
    if i not in list_2:
        list_1.remove(i)
print(list_1)

结果输出的结果是

['夭夭', '渣姐', '秃头企鹅', '王哥', '卷魔']

为什么会这样?通过debug发现,每删除一个元素,list_1里面的元素下标就会发生变化,而for循环里面是持续性的读取下一个值的,每次删除一个的时候,便会跳过一个。

既然如此我就是用下标删呗

for i in range(len(list_1)):
    if list_1[i] not in list_2:
        list_1.remove(list_1[i])
        continue
print(list_1)

这时候又发现,直接报错

IndexError: list index out of range

当删除一个元素之后,新列表的长度减少,i 还是根据原来列表的索引取值,当 i 超过当前的列表长度时,新列表没有该下标对应元素,索引越界。

解决办法

方案一(快捷)

list_1 = ['夭夭', '阿离', '渣姐', '秃头企鹅', '魁哥', '小白', '卷魔']
list_2 = ['旺仔', '秃头企鹅', '王哥']
j = 0
for i in range(len(list_1)):
    if list_1[j] not in list_2:
        list_1.remove(list_1[j])
        continue
    j+=1
print(list_1)

方案一方法的思路:

每次只要删除了,都从上一次的下标继续,如果这次没删除,则下标加一删下一个。看不太懂的可以丢自己编辑器里面加一些print进行分步分析。

输出

['秃头企鹅', '王哥']

方案二(简单)

*倒序
如果让索引倒序遍历列表就不会出现越界的问题了。*

for i in range(len(list_1)-1,-1,-1):
    if list_1[i] not in list_2:
        list_1.remove(list_1[i])
print(list_1)

方案二方法思路:

将索引倒序,这样不管你怎么删,我下标都是倒着来,肯定不会下标越界。(此方法对应解决最开始的下标越界的思路。)

注意细节:(自己多尝试,多写)

①len减一是因为左闭右开;

②第三个参数表示的是对数值所进行的操作,每次加上-1;

③第二个值表示最终加到-1,但不包含-1。(最终加到几,但是不包含本身)

输出

['秃头企鹅', '王哥']

方案三(粗暴)

while True:
    for i in list_1:
        if i not in list_2:
            list_1.remove(i)
            break
    else:
        break
print(list_1)

方案三思路:

无限循环,知道你搞完,这个不多解释,就是莽夫。

输出

['秃头企鹅', '王哥']

方案四(灵活)

d = dict(zip(range(len(list_1)),list_1))
for k,v in d.items():
    if v not in list_2:
        d[k]=[]
final_1 =  [v for k,v in d.items() if v]
print(final_1)

方案四思路:

讲列表转换成字典,再通过字典的value和list_2进行对比,如果不是list_2中的元素则赋值为空列表,最后拿到不是空列表的value,就是我们需要的列表了。

听起来会有点绕,自己尝试一下,一下就练了字典、列表、遍历、推导式、列表合并字典这些知识点哦。

输出

['秃头企鹅', '王哥']

上面用例列表推导式,zip,dict等方法,这些python基础我之前文章有写,大家可以多翻翻。(如果没有,那肯定是我不小心删了。)

最后,祝大家周末愉快!

gzh:梦无矶的测试开发之路

相关文章
|
6天前
|
存储 索引 Python
Python学习笔记----列表、元组和字典的基础操作
这篇文章是一份Python学习笔记,涵盖了列表、元组和字典的基础操作,包括它们的创建、修改、删除、内置函数和方法等。
Python学习笔记----列表、元组和字典的基础操作
|
4天前
|
Linux 网络安全 Python
Linux离线安装Python时ssh和hashlib死活安装不上的解决方案
本文提供了Linux环境下离线安装Python时遇到的"ImportError: No module named _ssl"和"ERROR:root:code for hash md5|sha1|sha224|sha256|sha384|sha512 was not found"两个问题的解决方案,通过设置OpenSSL环境变量和编辑Python源码配置文件来解决。
9 1
|
7天前
|
索引 Python
Day 7/100:Python列表
Day 7/100:Python列表
9 1
|
13天前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
15 7
|
10天前
|
存储 数据库 C++
"深入剖析Python元组(tuple):与列表的对比、特性解析及高效应用场景展示"
【8月更文挑战第9天】Python元组与列表虽均用于存储元素集合,但有本质差异。元组不可变,创建后无法修改,适合保护数据不被意外更改的场景,如作字典键或传递固定值。列表则可变,支持动态增删改,适用于需频繁调整的数据集。元组因不可变性而在性能上有优势,可用于快速查找。两者各有千秋,根据具体需求选择使用。例如,元组可用于表示坐标点或日期,而列表更适合管理用户列表或库存。
16 1
|
13天前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
11 3
|
14天前
|
Python
【Leetcode刷题Python】105. 从前序与中序遍历序列构造二叉树
LeetCode上105号问题"从前序与中序遍历序列构造二叉树"的Python实现,通过递归方法根据前序和中序遍历序列重建二叉树。
13 3
|
14天前
|
Python
【Leetcode刷题Python】145. 二叉树的后序遍历
LeetCode上145号问题"二叉树的后序遍历"的Python实现方法。
13 2
|
14天前
|
Python
【Leetcode刷题Python】144. 二叉树的前序遍历
LeetCode上144号问题"二叉树的前序遍历"的Python实现方法。
12 1
|
4天前
|
存储 数据安全/隐私保护 索引
Python基础语法day02字符串详解和列表
Python基础语法day02字符串详解和列表