这是第 204 篇原创
建议阅读时间:3分钟
0 前言
感谢粉丝:秋日私语,在 原创互助答疑群2 内,秋日私语遇到的一个list删除操作的问题,这是一个非常经典的坑。群内小伙伴:@数据科学-苏,@机器学习-guo等给出了可能的几个解决方法。秋日私语深度分析了这个问题,以下是他总结的笔记,再次感谢@秋日私语。
1 List删除的坑
先看这个坑:
test1 = ['a','b','c','','']
for i in test1:
if i == '':
test1.remove(i) #删除空元素
print(test1)
>>>['a', 'b', 'c', '']
这时发现并没有达到我们想要的结果。
2 原因分析
先了解一下python列表的数据结构,list 属于线性表,它的连续在于用一块连续的内存空间存储元素,在调用 remove 时,只是删除了地址内的元素,如下图所示:
a=[1,2,3]
for i in a:
print(id(i))
>>>1514106336 #此地址即为左边的连续地址
1514106368
1514106400
a=[1,2,3]
for i in a:
print(i,id(i))
print("------------------")
for i in a:
if i==1:
a.remove(i)
print(i,id(i))
print("------------------")
print(a)
>>>
1 1380150752
2 1380150784
3 1380150816
------------------
1 1380150752
3 1380150816
------------------
[2, 3]
回到问题,当我们删除test1中的空字符时,test1 = ['a','b','c','',''],for in 是对下标进行操作,而 remove 是对值进行操作,当 for 到达索引为3,即第一个空字符位置时,符合条件即删除。因为 list 是线性表,所以删除这个空字符时,同时后面的所有元素自动移动位置1,此时的 test1 等于 ['a','b','c',''],因为 for in 已经遍历到了索引3处,所以循环结束。
3 解决方法
删除列表中的空元素有这两种方法:
test1 = ['a','b','c','','']
#第一种
test2 = ['a','','b','','c','','']
while '' in test2:
test2.remove('')
print(test2)
>>>['a', 'b', 'c']
#第二种
test2_new = [i for i in test2 if i != ''] #生成一个新的列表
即删除列表中指定元素建议使用上述两种方法不要用 for 循环。
4 欢迎入群讨论
以上错误之处,有疑问的地方,或者待优化改进之处,欢迎公号内留言、微信群内提问作者。
微信群规定,群内严禁分享推文,只用于交流讨论。欢迎扫描群主微信,加入原创互助答疑 微信群。请注明:加群