【问题标题】:No items being removed from list没有从列表中删除的项目
【发布时间】:2017-09-03 11:49:29
【问题描述】:

我使用的是 Python 3.5,我的代码是

words = open("wordlist.txt").readlines()
words = [k[:-2] for k in words]
noletters = ["b", "d", "f", "g", "h", "i", "j", "k", "l", "p", "q", "t", "y"]
for n in words:
    for i in n:
        if i in noletters:
            words.remove(n)
            break
words.sort()
words.sort(key = len)
print(words)

这里,wordlist.txtreally, really, really long list of words。首先,我从列表中的每个项目中删除一些不必要的字符,然后我最终得到一个列表,其中每个项目都是一个单词 - 类似于 'hello'yugoslavia。到目前为止,这很有效。

然后,我创建了一个我不想出现在我从程序中得到的任何单词中的字母列表。然后对于列表中的每个项目,我检查单词中的每个字母,如果字母在列表中,我从列表中删除单词并跳出检查字母的内部循环(这会阻止系统尝试删除已删除的内容)。然后,我按字母顺序和单词长度对列表进行排序,然后打印列表。

问题:

  1. 循环没有从列表中删除任何内容,我不知道为什么。它肯定会进入循环 - 我添加了一些打印语句(在删除某些内容时在 words.remove(n) 行之后打印,以及在 break 行之后,查看它何时进入新词)。
  2. 按字符串长度排序的语句还添加了一堆从未出现在单词列表中的内容 - 例如,'o' 不在列表中,但它被添加了,还有几个空白字符串 ('') 等等 - 它看起来像是字母表中每个字母的所有可能组合。

【问题讨论】:

  • 别忘了关闭你打开的文件,否则你会泄露资源。另见 with 声明 effbot.org/zone/python-with-statement.htm
  • 如果单词不包含任何这些字母,您可以通过将单词附加到单独的列表来检查您的推理。

标签: python string list python-3.x for-loop


【解决方案1】:

来自文档for statement

如果你需要修改你在里面迭代的序列 循环(例如复制所选项目),建议 您首先制作副本。迭代一个序列不会 隐式复制。

如果我没有误解你的意思,也许你可以尝试做一个浅拷贝:

for n in words[:]:
    for i in n:
        if i in noletters:
            words.remove(n)
            break

或者也许你可以使用这个列表推导:

words=[n for n in words if  not any([i in noletters for i in n])]

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 2016-05-08
    • 2011-03-18
    • 2020-12-07
    • 2010-11-29
    • 2016-08-17
    相关资源
    最近更新 更多