没有项目从列表

时间:2017-04-08 01:23:51

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

我使用的是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'在列表中没有,但它已被添加,以及几个空白字符串('')等等 - 它看起来像是字母表中每个字母的所有可能组合。

1 个答案:

答案 0 :(得分:3)

来自文档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])]

希望这有帮助。