1

这就是我所做的:

for word in doc:
    if len(word) < 3:
        doc.remove(word)

但是,如果我这样做:

for word in doc:
    if len(word) < 3:
        print word

返回的结果是:“O”、“Of”、“30”、“4”。'我。' “如果”等等。

大多数两个字符项目都被删除了,但仍然有一些,我做错了什么吗?

4

6 回答 6

5

问题是python的for循环。

例如:如果你这样做:

arr = range(1, 10)
for x in arr:
    print x
    arr.remove(x)

然后您会看到并非所有 arr 中的项目都已删除。

在您的情况下,我们可以这样做:

newDoc = [ word for word in doc if len(word) >= 3 ]

欢迎来到蟒蛇。

于 2012-04-14T03:34:05.173 回答
2

为了准确回答你的问题,我们需要看看内容doc是什么。最好是在交互式 Python 解释器中显示的格式。

话虽如此,从列表中删除项目的理想(读取 pythonic)方法是 A)使用filter

filter(lambda x: len(x) > 2, doc)

或 B)使用列表推导:

[word for word in doc if len(word) > 2]
于 2012-04-14T03:37:39.087 回答
2

您应该反转逻辑并使用列表理解:

[ word for word in doc if len(word) >= 3 ]
于 2012-04-14T03:31:12.510 回答
1

我建议使用列表推导

doc = [w.strip() for w in doc if len(w.strip()) >= 3]

strip()删除空格。

于 2012-04-14T03:33:29.453 回答
0

改为创建要从中删除元素的列表的副本。

for word in doc[:]:
    if len(word) < 3:
        doc.remove(word)

一般来说,覆盖您正在迭代的数据并不是一个好习惯。你遇到了问题,就像你刚刚在这里做的那样。

于 2012-04-14T03:35:33.037 回答
0

当您删除一个元素时,列表会移动,并且循环将继续使用 +1 索引元素。然后它跳过一个单词。

为了测试它,在解释器中写下这些:

l = range(5)
for i in l:
    l.remove(i)
    print i, l

结果:

0 [1, 2, 3, 4]  
2 [1, 3, 4]  
4 [1, 3]  
于 2012-04-14T15:43:43.490 回答