<p>这条线:</p>
<pre><code>if j in list1:
list1.remove(j)
</code></pre>
<p>是你的问题。想想<code>for word in str_list</code>的第一次迭代,其中<code>word == 'ppl</code></p>
<p>请牢记以下代码:</p>
<pre><code> for j in listi: #for every char in word, 'p', 'p', 'l'
if j in list1: 'True for all three
list1.remove(j) 'removes all three letters
else:
shouldAdd = False
</code></pre>
<p>这将留给您<code>list1 == ['a','e']</code>。对<code>word</code>的下一次迭代将提供<code>word == 'al'</code>。如果我们再看一遍上面的代码,您将看到,因为在<code>list1</code>,<code>shouldAdd == False</code>中不再有<code>'l'</code>。而且,因为<code>a</code>在里面,所以现在不是了。你可以看到这是怎么回事。你知道吗</p>
<p>使用您的代码,您可以通过将<code>list1 = list(str)</code>移动到<code>for word in str_list:</code>循环的内部来解决这个问题,这样每次它都会重新初始化列表。我将尝试找到一个更为python的方法来完成这个函数,并在我可以的时候发布它。你知道吗</p>
<p>编辑:</p>
<p>以下是我的方法:</p>
<pre><code>>>> def is_sub_anagram(s, sub):
s = list(s)
try:
for c in sub: s.remove(c)
except:
return False
return True
>>> def find_sub_anagram_in_wordlist(s, str_list):
return list(filter(lambda x: is_sub_anagram(s,x), str_list))
>>> find_sub_anagram_in_wordlist('apple',['app','ppl','ae','le'])
['app', 'ppl', 'ae', 'le']
>>> find_sub_anagram_in_wordlist('apple',['app','ppl','ae','le','lle'])
['app', 'ppl', 'ae', 'le']
</code></pre>