【发布时间】:2015-10-12 01:48:37
【问题描述】:
我想在 Python 中遍历一个列表并删除特定项目。 我不想制作一个新的接受项目列表,因为在我的完整示例中,我想对我的列表进行一系列改进。这是一个简单的示例,我尝试删除列表中所有小于 3 的数字。
example = [1.,2.,3.,4.,5.,6.]
for e in example:
if e < 3.:
print "Removing:", e
example.remove(e)
else:
print "Accepting:", e
print "NAIVE:", example
Removing: 1.0
Accepting: 3.0
Accepting: 4.0
Accepting: 5.0
Accepting: 6.0
NAIVE: [2.0, 3.0, 4.0, 5.0, 6.0]
失败了。我认为它失败了,因为删除列表中的项目与 for 循环运行的索引混淆,即一旦项目 1. 被删除,项目 2. 在列表中的位置 0,但是那时,循环在位置 1。
我可以使用deepcopy 解决此问题,如下所示:
example = [1.,2.,3.,4.,5.,6.]
import copy
for e in copy.deepcopy(example):
if e < 3.:
print "Removing:", e
example.remove(e)
else:
print "Accepting:", e
print "DEEPCOPY:", example
Removing: 1.0
Removing: 2.0
Accepting: 3.0
Accepting: 4.0
Accepting: 5.0
Accepting: 6.0
DEEPCOPY: [3.0, 4.0, 5.0, 6.0]
这在这里有效,但这是一种好的做法吗?会导致其他意想不到的错误吗?有没有更好的方法来实现这一目标?还是这种结构(循环并从列表中删除)根本不合理?
我不想创建新的已接受项目列表,因为我想将一系列标准逐个应用于我的列表,并相应地删除项目。我不想为我应用的每个标准(可能很多)创建一个新列表,我也不想一次性应用我的所有标准(因为查看每个标准删除了多少项目等很有帮助) .
【问题讨论】:
-
列表中的值总是浮点数还是数字?或者它们也可以是可变对象?此外,refinements 是仅删除还是对列表元素也进行了其他类型的更改?
-
好问题。在我的全部工作中,该列表将是一个可变对象列表。改进是进一步删除和可能的其他更改
标签: python list for-loop deep-copy