初学者问题(Python)-如何从列表中删除特定长度以下的单词

初学者问题(Python)-如何从列表中删除特定长度以下的单词,python,Python,我就是这么做的: for word in doc: if len(word) < 3: doc.remove(word) 但是,如果我这样做: for word in doc: if len(word) < 3: print word 返回的结果是: “哦,” “当然” '30' '4.' “我。” “如果” 还有更多 大多数两个字符项已被删除,但仍有一些保留,我做错了什么吗?您应该反转逻辑并使用列表理解: [ word for w

我就是这么做的:

for word in doc:
    if len(word) < 3:
        doc.remove(word)
但是,如果我这样做:

for word in doc:
    if len(word) < 3:
        print word
返回的结果是: “哦,” “当然” '30' '4.' “我。” “如果” 还有更多


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

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

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

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

[ word for word in doc if len(word) >= 3 ]
[word for word in doc if len(word) > 2]
我建议使用

该条带将删除空白。

我建议使用


该条带将删除空白。

问题在于python的for循环

例如:如果您喜欢这样做:

arr = range(1, 10)
for x in arr:
    print x
    arr.remove(x)
newDoc = [ word for word in doc if len(word) >= 3 ]
然后您将看到,arr中的所有项都没有被删除

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

arr = range(1, 10)
for x in arr:
    print x
    arr.remove(x)
newDoc = [ word for word in doc if len(word) >= 3 ]

欢迎使用python。

问题在于python的for循环

例如:如果您喜欢这样做:

arr = range(1, 10)
for x in arr:
    print x
    arr.remove(x)
newDoc = [ word for word in doc if len(word) >= 3 ]
然后您将看到,arr中的所有项都没有被删除

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

arr = range(1, 10)
for x in arr:
    print x
    arr.remove(x)
newDoc = [ word for word in doc if len(word) >= 3 ]

欢迎使用python。

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

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

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

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

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

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

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

也就是说,从列表中删除项目的理想阅读Python方式是使用过滤器:

或B使用列表理解:

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

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

也就是说,从列表中删除项目的理想阅读Python方式是使用过滤器:

或B使用列表理解:

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

删除元素时,列表将移动,循环将继续使用+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]  

删除元素时,列表将移动,循环将继续使用+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]  

这是什么语言?什么是“doc”?对不起,这是python语言doc’实际上只是一个随机单词和数字的列表欢迎来到StackOverflow。你的标签没有任何意义。请编辑您的问题并使用有意义的标记,例如您开始使用的语言以及文档的定义及其内容的示例。张贴一些对任何人都毫无意义但对你或其他人没有帮助的词语。谢谢我已将标记更改为python。仍然需要更多信息-这些单词中似乎有一些只是附加了空格。请向我们显示您的完整输入单词列表和应删除的完整输出单词列表。如果列表很长,请尝试将其缩减为一个较短的列表,以显示问题。这是什么语言?什么是“doc”?对不起,这是python语言doc’实际上只是一个随机单词和数字的列表欢迎来到StackOverflow。你的标签没有任何意义。请编辑您的问题并使用有意义的标记,例如您开始使用的语言以及文档的定义及其内容的示例。张贴一些对任何人都毫无意义但对你或其他人没有帮助的词语。谢谢我已将标记更改为python。仍然需要更多信息-这些单词中似乎有一些只是附加了空格。请向我们显示您的完整输入单词列表和应删除的完整输出单词列表。如果列表很长,请尝试将其缩减为一个较短的列表,以说明问题。我很高兴看到有人试图解释OP的方法出错的原因,而不仅仅是说列表理解更酷更好:@octern不幸的是,这不能解释原因,虽然它确实展示了一个发生这种情况的例子。我没有在python中找到任何关于for循环的文档,但是从输出来看,我想问题是:如果对于arr中的x,索引I中的x,并且您arr.removex,那么下一个x不是arr[I+1],而是arr[I+2]->这意味着python跳过了arr的一个成员。以上所有这些都是我猜想的。我认为这是正确的。我见过很多例子,当你在迭代序列的同时改变序列时,非直观的事情会出错。如果您不想使用列表理解,一种解决方案可以是在对原始列表执行删除操作的同时复制列表并对其进行迭代。这将适用于移除操作,该操作通过元素的值移除元素,但如果您
我使用了一种通过数字索引引用值的方法。我很高兴看到有人试图解释OP的方法出错的原因,而不仅仅是说列表理解更酷更好:@octern不幸的是,这不能解释为什么,虽然它确实展示了一个发生这种情况的例子。我没有在python中找到任何关于for循环的文档,但是从输出来看,我想问题是:如果对于arr中的x,索引I中的x,并且您arr.removex,那么下一个x不是arr[I+1],而是arr[I+2]->这意味着python跳过了arr的一个成员。以上所有这些都是我猜想的。我认为这是正确的。我见过很多例子,当你在迭代序列的同时改变序列时,非直观的事情会出错。如果您不想使用列表理解,一种解决方案可以是在对原始列表执行删除操作的同时复制列表并对其进行迭代。这将适用于remove操作,该操作按元素的值删除元素,但如果您使用的方法是通过数字索引引用值,则仍然会发疯。筛选器不被视为pythonic,因为列表理解使一切都更清晰。@jamylak:True。我想我说错了。尽管如此,它还是避免了使用解释循环。过滤器并不被认为是pythonic,因为列表理解使一切变得更清晰。@jamylak:True。我想我说错了。不过,它避免使用解释循环。