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

相关文章
|
29天前
|
索引 Python
Python列表
Python列表。
48 8
|
1月前
|
C语言 Python
[oeasy]python054_python有哪些关键字_keyword_list_列表_reserved_words
本文介绍了Python的关键字列表及其使用规则。通过回顾`hello world`示例,解释了Python中的标识符命名规则,并探讨了关键字如`if`、`for`、`in`等不能作为变量名的原因。最后,通过`import keyword`和`print(keyword.kwlist)`展示了Python的所有关键字,并总结了关键字不能用作标识符的规则。
35 9
|
1月前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
65 14
|
1月前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
92 10
|
2月前
|
数据处理 开发者 Python
Python中的列表推导式:简洁高效的数据处理
在编程世界中,效率和可读性是代码的两大支柱。Python语言以其独特的简洁性和强大的表达力,为开发者提供了众多优雅的解决方案,其中列表推导式便是一个闪耀的例子。本文将深入探讨列表推导式的使用场景、语法结构及其背后的执行逻辑,带你领略这一特性的魅力所在。
|
2月前
|
开发者 Python
探索Python中的列表推导式:简洁而强大的工具
【10月更文挑战第41天】 在编程的世界中,效率与简洁是永恒的追求。本文将深入探讨Python编程语言中一个独特且强大的特性——列表推导式(List Comprehension)。我们将通过实际代码示例,展示如何利用这一工具简化代码、提升性能,并解决常见编程问题。无论你是初学者还是资深开发者,掌握列表推导式都将使你的Python之旅更加顺畅。
|
2月前
|
数据可视化 搜索推荐 Shell
Python与Plotly:B站每周必看榜单的可视化解决方案
Python与Plotly:B站每周必看榜单的可视化解决方案
|
2月前
|
Python
探索Python中的列表推导式
【10月更文挑战第38天】本文深入探讨了Python中强大而简洁的编程工具——列表推导式。从基础使用到高级技巧,我们将一步步揭示如何利用这个特性来简化代码、提高效率。你将了解到,列表推导式不仅仅是编码的快捷方式,它还能帮助我们以更加Pythonic的方式思考问题。准备好让你的Python代码变得更加优雅和高效了吗?让我们开始吧!
|
2月前
|
算法 定位技术 Python
震惊!Python 图结构竟然可以这样玩?DFS&BFS 遍历技巧大公开
在 Python 编程中,图是一种重要的数据结构,而深度优先搜索(DFS)和广度优先搜索(BFS)是遍历图的两种关键算法。本文将通过定义图的数据结构、实现 DFS 和 BFS 算法,并通过具体示例展示其应用,帮助读者深入理解这两种算法。DFS 适用于寻找路径和检查图连通性,而 BFS 适用于寻找最短路径。掌握这些技巧,可以更高效地解决与图相关的复杂问题。
36 2
|
2月前
|
Python
不容错过!Python中图的精妙表示与高效遍历策略,提升你的编程艺术感
本文介绍了Python中图的表示方法及遍历策略。图可通过邻接表或邻接矩阵表示,前者节省空间适合稀疏图,后者便于检查连接但占用更多空间。文章详细展示了邻接表和邻接矩阵的实现,并讲解了深度优先搜索(DFS)和广度优先搜索(BFS)的遍历方法,帮助读者掌握图的基本操作和应用技巧。
44 4