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。
为了准确回答您的问题,我们需要了解
这就是说,从列表中删除项目的理想方法是a)使用
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] |
号
删除元素时,列表移动,循环将继续使用+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) |
一般来说,覆盖正在迭代的数据是不好的做法。你遇到了一些问题,就像你刚才在这里遇到的那样。