这就是我所做的:
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”。'我。' “如果”等等。
大多数两个字符项目都被删除了,但仍然有一些,我做错了什么吗?
这就是我所做的:
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”。'我。' “如果”等等。
大多数两个字符项目都被删除了,但仍然有一些,我做错了什么吗?
问题是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 ]
欢迎来到蟒蛇。
为了准确回答你的问题,我们需要看看内容doc
是什么。最好是在交互式 Python 解释器中显示的格式。
话虽如此,从列表中删除项目的理想(读取 pythonic)方法是 A)使用filter
:
filter(lambda x: len(x) > 2, doc)
或 B)使用列表推导:
[word for word in doc if len(word) > 2]
您应该反转逻辑并使用列表理解:
[ word for word in doc if len(word) >= 3 ]
改为创建要从中删除元素的列表的副本。
for word in doc[:]:
if len(word) < 3:
doc.remove(word)
一般来说,覆盖您正在迭代的数据并不是一个好习惯。你遇到了问题,就像你刚刚在这里做的那样。
当您删除一个元素时,列表会移动,并且循环将继续使用 +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]