我正在尝试编写一个函数,它返回一个字符串,该字符串中的字母不是LettersGuesed
words = list('abcdefghijklmnopqrstuvwxyz')
def getAvailableLetters(lettersGuessed):
[words.remove(letter) for letter in words if letter in lettersGuessed]
return ''.join([str(elem) for elem in words])
然后我调用我的函数
getAvailableLetters(['e', 's', 'i', 'k', 'p', 'r'])
但结果与我预期的不同。 我的输出:
'abcdfghjlmnoqstuvwxyz'
# the letter 's' in the output, but it shouldn't be there.
正确输出:
'abcdfghjlmnoqtuvwxyz'
我做错了什么
remove()
函数递减words
的长度,而在Python中,循环变量仅在循环开始时初始化其限制。试着用一个小例子来理解这一点此代码输出
[1, 4, 5]
,而预期的输出是[1, 5]
。这是因为,i
已初始化为从0到5索引。第一次lis.remove()
删除2时,lis的长度减少了,它被更新为lis = [1, 4, 6, 5]
,现在我应该指向4(下一个元素),而现在我指向6,即索引2(因为2位于索引1),因此从不检查值4。同样的情况也发生在代码中对于解决方案,最好使用
while
循环。这个问题不会出现在while循环中,而只出现在for循环中原因是您在遍历列表时正在修改它-不应该这样做。 我将在这里分享@AlexMartelli在one of his answers中给出的建议:
这里有一个替代解决方案(也使用snake_case),使用集合-假设可用字母和猜测字母都不包含重复的字母(除非错误):
这里有一个警告,上面的解决方案可能不遵守您指定字母的顺序
如果您仍想坚持列表,请分两个阶段进行:
我将给您一个小示例,以了解在迭代时从列表中删除元素时发生的情况:
输出:
如您所见,如果在迭代列表时删除一个元素,则会修改列表的大小,并且从一个迭代到另一个迭代,则会跳过下一个元素,for循环在每次迭代后都会随着索引的增加而增加,希望抓住下一个元素,但您会使用一个元素来收缩列表,因此for循环实际上会跳过1个元素
如果要修改全局变量
words
,可以使用:输出:
如果只想返回不在
lettersGuessed
中的字母,而不修改全局变量words
,请执行以下操作:相关问题 更多 >
编程相关推荐