<p>问题是:</p>
<pre><code>if word not in defaultWords:
</code></pre>
<p>对文件使用<code>in</code>运算符会产生意外的结果</p>
<p>文件不支持<code>__contains__</code>,但它们的行为类似于行序列,因此<code>if word in file</code>只是在行上迭代,并产生意外的效果:</p>
<pre><code>In [1]: f = open('/usr/share/dict/words')
In [2]: 'black\n' in f
Out[2]: True
In [3]: 'black\n' in f
Out[3]: False
In [4]: f.seek(0)
In [5]: 'black\n' in f
Out[5]: True
</code></pre>
<p>相反,在文件中创建一组所有单词(使用<code>strip</code>清除多余的空白):</p>
<pre><code>with open('/usr/share/dict/words') as f:
words = set(line.strip() for line in f)
</code></pre>
<p>并使用<code>words</code>进行查找</p>
<hr/>
<p>编辑:一旦设置好,您可能会尝试执行以下操作:</p>
<pre><code>for word in myWords:
if word not in words:
myWords.remove(word)
</code></pre>
<p>但是在遍历列表的同时编辑它是一个<a href="https://stackoverflow.com/questions/6022764/python-removing-list-element-while-iterating-over-list">bad</a><a href="https://stackoverflow.com/questions/1637807/modifying-list-while-iterating">idea</a>。相反,您可以在副本上迭代:</p>
<pre><code>for word in list(myWords):
if word not in words:
myWords.remove(word)
</code></pre>
<p>瞧,它起作用了。但是,嘿,<code>words</code>现在是一个集合了,那么为什么还要麻烦循环呢?您可以使用<a href="https://docs.python.org/2/library/stdtypes.html#set.intersection" rel="nofollow noreferrer">^{<cd7>}</a>简单地说:</p>
<pre><code>return words.intersection(myWords)
</code></pre>
<hr/>
<p>练习:如何避免将整个排列列表<code>myWords</code>同时保存在内存中</p>