初学者问题(Python)-如何从列表中删除一定长度的单词[重复]

Posted

技术标签:

【中文标题】初学者问题(Python)-如何从列表中删除一定长度的单词[重复]【英文标题】:Beginner Issue (Python) - How do I remove words from a list under a certain length [duplicate] 【发布时间】:2012-04-26 09:38:25 【问题描述】:

这就是我的工作:

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

但是,如果我这样做:

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

返回的结果是: '哦,' '的' '30' “4。” '一世。' '如果' 等等。

大部分两个角色项目都被删除了,但仍有一些,我做错了什么吗?

【问题讨论】:

这是什么语言?什么是“文档”? 对不起,这是在 python 中。 'doc' 实际上只是一个随机单词和数字的列表 欢迎来到 ***。您的任何标签都没有任何意义。请编辑您的问题并使用有意义的标签,例如您开始使用的语言(以及doc 的定义及其内容示例会有所帮助)。发布几个对任何人都毫无意义但对您(或其他任何人)没有帮助的词。谢谢。 :) 我已将标签更改为python。仍然需要更多信息 - 其中一些单词似乎只是附加了空格。 请向我们展示您的输入单词的完整列表以及应该删除的输出单词的完整列表。如果列表很长,请尝试将其缩减为仍能证明问题的较短列表。 【参考方案1】:

你应该颠倒逻辑并使用列表推导:

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

【讨论】:

【参考方案2】:

我建议使用list comprehensions

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

strip() 将删除空格。

【讨论】:

【参考方案3】:

问题是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 ]

欢迎来到 python。

【讨论】:

我很高兴看到有人试图解释为什么 OP 的方法出错了,而不是仅仅说列表推导更酷更好(: @octern 不幸的是,这没有解释原因,尽管它确实显示了它发生的一个例子。 我没有找到任何关于python中for循环的文档,但从输出我猜问题是:如果for x in arrx在索引i,你@987654326 @,下一个x 不是arr[i+1] 而是arr[i+2] -> 这意味着python 跳过arr 的一个成员。以上都是我的猜测。 我认为是对的。当您在迭代序列的同时更改序列时,我已经看到了许多不直观的事情出错的例子。如果您不想使用列表推导,一种解决方案可能是制作列表的副本并对其进行迭代,同时对原始列表执行删除操作。这适用于删除操作,该操作按元素的值删除元素,但如果您使用通过数字索引引用值的方法,仍然会发疯。【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

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

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

或 B) 使用列表推导:

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

【讨论】:

filter 不被认为是 Python 的,因为列表推导使一切更清晰。 @jamylak:是的。我想我说错了。尽管如此,它还是避免使用解释循环。【参考方案6】:

当您删除一个元素时,列表会移动,并且循环将继续使用 +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]  

【讨论】:

以上是关于初学者问题(Python)-如何从列表中删除一定长度的单词[重复]的主要内容,如果未能解决你的问题,请参考以下文章

坚持不懈续集 初学者挑战学习Python编程30天

如何使用 Python 从字符串中删除符号? [复制]

Python:如何从列表项中删除单引号

从Python列表中的特定位置删除项目[重复]

使用正则表达式从python中的列表项中删除子字符串

安卓手机长按home键如何设置任务管理器在最近使用里?