首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >记录贴 2 | Python删除List内元素的坑和原因深度分析

记录贴 2 | Python删除List内元素的坑和原因深度分析

作者头像
double
发布2018-07-31 17:23:01
5050
发布2018-07-31 17:23:01
举报
文章被收录于专栏:算法channel算法channel
图:brooke-cagle-336467-unsplash

这是第 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 欢迎入群讨论

以上错误之处,有疑问的地方,或者待优化改进之处,欢迎公号内留言、微信群内提问作者。

微信群规定,群内严禁分享推文,只用于交流讨论。欢迎扫描群主微信,加入原创互助答疑 微信群。请注明:加群

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档