0

先上代码:

li = [32,45,23,66,66,89,27]
print li
for k in li:
    if k == 66:
        li.remove(k)
print li

结果:

> [32, 45, 23, 66, 66, 89, 27] 

> [32, 45, 23, 66, 89, 27]

这是我的问题:当我删除第一个66时,第二个和其他项目将向前移动一个索引,下一个k将是89。第二个66还在。我怎样才能删除它?

4

3 回答 3

3

最常见的方法是遍历列表的副本,而不是原始列表:

for k in li[:]:
    #do stuff

但是,我更喜欢使用列表理解:

[k for k in li if k != 66]
于 2012-05-11T04:03:31.857 回答
2

请参阅我对循环问题的回答,同时遍历列表并删除重复出现的元素,以了解您遇到此问题的原因。

在这种情况下,您可以这样做:

li = [item for item in li if item != 66]

做一个新的清单。

如果你必须做很多 s,列表推导也会更快,remove因为每个remove都必须遍历整个列表,而列表推导只遍历整个列表一次。

于 2012-05-11T04:03:39.390 回答
0

我猜你想要做的是这个。所以在你的情况下:

li = [32,45,23,66,66,89,27]
print li
li[:] = [x for x in li if x != 66]
print li

当然,如果你 用普通的 for 循环来做,你总是可以li反向迭代:

li = [32,45,23,66,66,89,27]
print li
for k in reversed(li):
    if k == 66:
        li.remove(k)
print li

但请注意,这是非常低效的。因为remove 搜索第一次出现并删除它。因此,您可以多次有效地迭代列表。

于 2012-05-11T04:03:08.690 回答