资讯专栏INFORMATION COLUMN

Python语法糖——遍历列表时删除元素

kid143 / 1199人阅读

摘要:原因是用发起任何形式的遍历时,它的遍历顺序都是从最初就确定的,而在遍历中删除了元素会导致当前索引的变化,这样一是会导致漏删元素,二是会导致遍历超过链表的长度。所以遍历一个时要删除其中的部分元素就需要其他的解决方案。

Python的for可以遍历一个List,但是在遍历的过程中删除元素常常会得到意想不到的结果甚至程序出现异常,例如:

lst = [1, 1, 0, 2, 0, 0, 8, 3, 0, 2, 5, 0, 2, 6]

for item in lst:
    if item == 0:
        lst.remove(item)
print lst

输出: [1, 1, 2, 8, 3, 2, 5, 0, 2, 6]

这段代码的本意是想删除列表中元素为 0 的项,但实际跑起来并不是那个结果。

再看下面这个例子,利用索引来遍历删除列表中的元素:

for item in range(len(lst)):
    if lst[item] == 0:
        del lst[item]
print lst

输出: IndexError: list index out of range

这时候就报错了,抛出了数组下标越界的异常。原因是用for发起任何形式的遍历时,它的遍历顺序都是从最初就确定的,而在遍历中删除了元素会导致当前索引的变化,这样一是会导致漏删元素,二是会导致遍历超过链表的长度。

所以遍历一个List时要删除其中的部分元素就需要其他的解决方案。

方法一:可以使用filter过滤返回新的List

lst = [1, 1, 0, 2, 0, 0, 8, 3, 0, 2, 5, 0, 2, 6]

lst = filter(lambda x: x != 0, lst)
print lst

这样可以安全删除列表中值为 0 的元素了,filter包括两个参数,分别是functionlistfilter把传入的函数依次作用于每个元素,然后根据返回值是True还是False来决定是保留还是丢弃该元素。

方法二:列表解析

lst = [x for x in lst if x != 0]
print lst

方法三:或者遍历拷贝的List,操作原始的List

for item in lst[:]:
    if item == 0:
        lst.remove(item)
print lst

方法四:while循环来搞定,每次循环都先会判断 0 是否在列表中

while 0 in lst:
    lst.remove(0)
print lst

方法五:倒序循环遍历

for item in range(len(lst) - 1, -1, -1):
    if lst[item] == 0:
        del lst[item]
print lst

倒序是最geek的解决办法,但是倒序的代码可读性差,推荐用filter,这样写出来的代码更Pythonic。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38218.html

相关文章

  • 对比几段代码,看看你是 Python 菜鸟还是老鸟

    摘要:最终还是要写上足够量的代码,才会有悟道的那一刻。另外,对于代码本身,有一套书写规范,叫做。 Python 里有个小彩蛋: 在 Python Shell 里输入 import this showImg(https://segmentfault.com/img/remote/1460000018394156?w=600&h=463); 这段话被称作 Python 之禅 ( The Zen ...

    dingding199389 评论0 收藏0
  • Python技术点

    摘要:内置函数实现对可迭代对象进行进一步处理。文件文件的打开权限打开文件,文件不存在报异常写入文件,文件不存在则创建。文件不存在则创建。追加文件,具有读写权限。 Python基础类型: 1.Tuple元组,内容不可改变,但是允许元素内部存在list等类型的元素,并且允许改变列表的值,所谓内容不可变指的是在内存中指向的地址是不变的。 temp=(1,2,[3,4]) temp[-1]....

    Lionad-Morotar 评论0 收藏0
  • 002_第一部分_[字典 / 列表解析 / 字符串操作 / STR与BYTES的区别 ]

    摘要:一字典定义字典获取元素这两个的区别用在不存在的时候不会抛出设置当不存在的时候返回的内容增加和修改元素修改和增加元素的方法都是这个删除元素删除的同时返回删除的内容如果删除不存在的会报这个时候就需要给定返回值这样返回的就是不会报错误从字典中随机 一.字典: 定义字典:d = {}d = dict()d = {a:1, b:2} 1.获取元素: d[a] d.get(a) >这两个的区别,用...

    CastlePeaK 评论0 收藏0
  • 傻瓜式学Python3——列表

    摘要:列表是编程中使用频率极高的数据结构,由一系列按特定顺序排列的元素组成,用表示,逗号分隔元素,类似中的数组。由于列表包含多个元素,所以通常命名为复数形式,如,等。使用切片裁剪获取子列表使用列表名裁剪获取对应索引区间的子列。 前言: 好久不见,突然发觉好久没写博客了,最近迷上了 Python 无法自拔,了解了一下,Python 简单易学,尤其是接触过 java 的人,入门 Python 更...

    Andrman 评论0 收藏0
  • Python 语法速览与实战清单

    摘要:本文是对于现代开发语法基础与工程实践的总结,更多相关资料参考学习与实践资料索引本文参考了,等。 showImg(https://segmentfault.com/img/remote/1460000012129659); 本文是对于 现代 Python 开发:语法基础与工程实践的总结,更多 Python 相关资料参考 Python 学习与实践资料索引;本文参考了 Python Cras...

    sumory 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<