Я приведу небольшой пример, чтобы увидеть, что происходит, когда вы удаляете элементы из списка во время итерации:
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)\
вывод:
_________________________
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']
при Можно видеть, что если вы удаляете элемент во время итерации списка, вы изменяете размер списка и переходите от одного этапа к другому, переходя к следующему элементу, значение l oop увеличивается на единицу после каждой итерации. ожидая получить следующий элемент, но вы сжимаете список одним элементом, так что для l oop фактически прыгает 1 элемент
, если вы хотите изменить глобальную переменную words
, вы можете использовать:
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'])
вывод:
'abcdfghjlmnoqtuvwxyz'
, если вы хотите только вернуть буквы, которых нет в lettersGuessed
без изменения глобальной переменной words
:
def getAvailableLetters(lettersGuessed):
return ''.join(c for c in words if c not in lettersGuessed)