关于初学者问题(Python):初学者问题(Python) – 如何在一定长度内从列表中删除单词

Beginner Issue (Python) - How do I remove words from a list under a certain length

本问题已经有最佳答案,请猛点这里访问。

我就是这样做的:

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

但是,如果我这样做:

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

返回的结果是:"哦,""的""30"‘4’。"我""如果"还有更多。

大多数两个字符的项目被删除,但仍有一些保留下来,我做错什么了吗?


问题是Python的for循环。

例如:如果您这样做:

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

然后,您将看到并非所有arr中的项目都被删除。

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

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

欢迎使用python。


为了准确回答您的问题,我们需要了解doc的内容。最好以交互python解释器中显示的格式显示。

这就是说,从列表中删除项目的理想方法是a)使用filter

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

或者b)使用列表理解:

1
[word for word in doc if len(word) > 2]


您应该颠倒逻辑并使用列表理解:

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

我建议使用列表理解

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

strip()将删除空白。


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

要测试它,请在解释器中编写以下内容:

1
2
3
4
l = range(5)
for i in l:
    l.remove(i)
    print i, l

结果:

1
2
3
0 [1, 2, 3, 4]  
2 [1, 3, 4]  
4 [1, 3]


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

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

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