运维开发网

Python安全删除列表元素的方法

运维开发网 https://www.qedev.com 2022-09-27 16:27 出处:网络
这篇文章主要介绍了python安全地删除列表元素的方法,分享的方法有创建新列表,过滤元素和列表副本上迭代,下面相关内容需要的小伙伴可以参考一下

这篇文章主要介绍了python安全地删除列表元素的方法,分享的方法有创建新列表,过滤元素和列表副本上迭代,下面相关内容需要的小伙伴可以参考一下

前言:

看似简单的任务往往暗藏陷阱!

一个常见的任务是在一个列表上迭代,并根据条件删除一些元素。本文将展示完成这项任务的不同方法,同时展示一些要避免的陷阱。

假设我们需要修改列表A,我们必须删除所有不均匀的项。

首先,实现辅助函数even(x)来判断一个数x是否是偶数:

a = [1, 2, 2, 3, 4]def even(x): return x % 2 == 0


方法1: 创建新列表,过滤元素


1a) 列表推导,创建新列表

使用列表派生创建一个新列表,其中只包含您不想删除的元素,并将其重新分配给:

a = [1, 2, 2, 3, 4]def even(x): return x % 2 == 0# 列表推导,但创建了一个新的变量aa = [x for x in a if not even(x)]# --gt; a = [1, 3]print(a)


1b) 列表推导,对a[:]赋值

上面的代码创建了一个新的变量a。我们也可以通过给slice a[:]赋值来改变现有的列表。如果有需要反映变更的其他参考,这个方法会更有效率,而且可能会很有用。

a = [1, 2, 2, 3, 4]def even(x): return x % 2 == 0# 列表推导,但赋值给a[:] 就地改变列表a[:] = [x for x in a if not even(x)]# --gt; a = [1, 3]print(a)


1c) 使用itertools.filterfalse()

Itertools模块为非常有效的循环迭代提供了各种函数,并提供了过滤元素的方法。

a = [1, 2, 2, 3, 4]def even(x): return x % 2 == 0# 通过itertools 快速过滤from itertools import filterfalsea[:] = filterfalse(even, a)# --gt; a = [1, 3]print(a)


方法2:列表副本上迭代

如果您真的想保留for语法,那么您需要迭代列表的副本(可以通过使用[:],简单地创建副本)。

现在,当条件为真时,您可以从原始列表中删除元素:

a = [1, 2, 2, 3, 4]def even(x): return x % 2 == 0# 注意是在列表副本a[:] 上循环for item in a[:]: if even(item): a.remove(item)# --gt; a = [1, 3]print(a)


常见陷阱

千万不要在同一个列表上循环,在迭代过程中修改!

和上面的代码一样,只是没有在副本上循环。删除一个元素会将所有后续元素向左移动一个位置,因此在下一次迭代中,会跳过一个元素。

这可能会导致不正确的结果:

a = [1, 2, 2, 3, 4]def even(x): return x % 2 == 0# 直接在变量a上进行循环,没有在副本上for item in a: if even(item): a.remove(item)# --gt; a = [1, 2, 3] !!!print(a)

另外,在列表循环过程中,千万不要修改索引!

这是不正确的,因为在循环中改变I不会影响下一次迭代中I的值。这个例子也会产生意想不到的效果,甚至导致IndexErrors,

例如,在这里:

a = [1, 2, 2, 3, 4]def even(x): return x % 2 == 0# 试图在循环在改变索引i,但出错!for i in range(len(a)): if even(a[i]): del a[i] i -= 1# --gt; IndexError: list index out of rangeprint(a)

关于python安全删除列表元素的方法的文章到此结束。关于python删除列表元素的更多信息

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号