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:梦无矶的测试开发之路

相关文章
|
11天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
14 1
|
12天前
|
弹性计算 安全 数据处理
Python高手秘籍:列表推导式与Lambda函数的高效应用
列表推导式和Lambda函数是Python中强大的工具。列表推导式允许在一行代码中生成新列表,而Lambda函数则是用于简单操作的匿名函数。通过示例展示了如何使用这些工具进行数据处理和功能实现,包括生成偶数平方、展平二维列表、按长度排序单词等。这些工具在Python编程中具有高度的灵活性和实用性。
|
12天前
|
Python
SciPy 教程 之 SciPy 模块列表 9
SciPy教程之常量模块介绍,涵盖多种单位类型,如公制、质量、角度、时间、长度、压强等。示例展示了如何使用`scipy.constants`模块查询不同压强单位对应的帕斯卡值,包括atm、bar、torr、mmHg和psi。
11 1
|
8天前
|
Python
SciPy 教程 之 SciPy 模块列表 16
SciPy教程之SciPy模块列表16 - 单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了力学单位的使用,如牛顿、磅力和千克力等。
11 0
|
9天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy 教程之 SciPy 模块列表 15 - 功率单位。常量模块包含多种单位,如公制、质量、时间等。功率单位中,1 瓦特定义为 1 焦耳/秒,表示每秒转换或耗散的能量速率。示例代码展示了如何使用 `constants` 模块获取马力值(745.6998715822701)。
11 0
|
9天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy教程之SciPy模块列表15:单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。功率单位以瓦特(W)表示,1W=1J/s。示例代码展示了如何使用`constants`模块获取马力(hp)的值,结果为745.6998715822701。
13 0
|
10天前
|
C语言 Python
探索Python中的列表推导式:简洁而强大的工具
【10月更文挑战第24天】在Python编程的世界中,追求代码的简洁性和可读性是永恒的主题。列表推导式(List Comprehensions)作为Python语言的一个特色功能,提供了一种优雅且高效的方法来创建和处理列表。本文将深入探讨列表推导式的使用场景、语法结构以及如何通过它简化日常编程任务。
|
10天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy 教程之 SciPy 模块列表 13 - 单位类型。常量模块包含多种单位:公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例:`constants.zero_Celsius` 返回 273.15 开尔文,`constants.degree_Fahrenheit` 返回 0.5555555555555556。
11 0
|
11天前
|
Python
SciPy 教程 之 SciPy 模块列表 11
SciPy教程之SciPy模块列表11:单位类型。常量模块包含公制单位、质量单位、角度换算、时间单位、长度单位、压强单位、体积单位、速度单位、温度单位、能量单位、功率单位、力学单位等。体积单位示例展示了不同体积单位的换算,如升、加仑、流体盎司、桶等。
11 0
|
12天前
|
Python
SciPy 教程 之 SciPy 模块列表 9
SciPy 教程之 SciPy 模块列表:常量模块包含多种单位类型,如公制单位、质量单位、时间单位等。压强单位部分展示了如何将不同单位转换为帕斯卡,例如 psi 转换为 6894.757293168361 帕斯卡。
11 0