<p>我将给您一个小示例,以了解在迭代时从列表中删除元素时发生的情况:</p>
<pre><code>l = ['a', 'b', 'c', 'd', 'e', 'f']
for i, c in enumerate(l):
print('_' * 25)
print('iteration', i)
print('index value', i)
print('elemnt at index ', i, ':', l[i])
print('list length:', len(l))
l.remove(c)
print('\nafter removing an element')
print('list length:', len(l))
print('index value', i)
if len(l) > i:
print('elemnt at index ', i, ':', l[i]) # this element will not be removed
print('_' * 40)
print('list after iterateion:', l)\
</code></pre>
<p>输出:</p>
<pre><code>_________________________
iteration 0
index value 0
elemnt at index 0 : a
list length: 6
after removing an element
list length: 5
index value 0
elemnt at index 0 : b
_________________________
iteration 1
index value 1
elemnt at index 1 : c
list length: 5
after removing an element
list length: 4
index value 1
elemnt at index 1 : d
_________________________
iteration 2
index value 2
elemnt at index 2 : e
list length: 4
after removing an element
list length: 3
index value 2
elemnt at index 2 : f
________________________________________
list after iterateion: ['b', 'd', 'f']
</code></pre>
<p>如您所见,如果在迭代列表时删除一个元素,则会修改列表的大小,并且从一个迭代到另一个迭代,则会跳过下一个元素,for循环在每次迭代后都会随着索引的增加而增加,希望抓住下一个元素,但您会使用一个元素来收缩列表,因此for循环实际上会跳过1个元素</p>
<p>如果要修改全局变量<code>words</code>,可以使用:</p>
<pre><code>def getAvailableLetters(lettersGuessed):
global words
words = [c for c in words if c not in lettersGuessed]
return ''.join([str(elem) for elem in words])
getAvailableLetters(['e', 's', 'i', 'k', 'p', 'r'])
</code></pre>
<p><strong>输出:</strong></p>
<pre><code>'abcdfghjlmnoqtuvwxyz'
</code></pre>
<p>如果只想返回不在<code>lettersGuessed</code>中的字母,而不修改全局变量<code>words</code>,请执行以下操作:</p>
<pre><code>def getAvailableLetters(lettersGuessed):
return ''.join(c for c in words if c not in lettersGuessed)
</code></pre>