Python - 替换字符串中特定位置的字母所有出现次数
我正在用Python创建一个电视游戏节目“Lingo”。
在这个游戏中,玩家需要猜一个五个字母的单词。他们一开始会随机猜一个五个字母的单词。然后游戏板会亮起,显示他们猜的单词和实际单词的匹配情况。
比如说,如果实际单词是“gorge”,而玩家猜的是“eagle”,那么游戏板会显示字母'e'和'g'在实际单词中存在,但它们的位置不对。(在“gorge”中,g的索引是[0]和[3],而在“eagle”中,g的索引是[2])。
再比如,如果实际单词是“happy”,而用户猜的是“harpy”,那么游戏板会显示有三个字母在实际单词中,并且它们的位置也是正确的。(h-a-y)。
在我的Python实现中,我用'~'来标记一个字母是正确的,但位置不对。如果字母是正确的并且位置也对,我会用'!'来标记。
这个重要的功能看起来是这样的:
wordGuess = input("Guess a letter: ")[0:5]
for letter in wordGuess:
if letter in realWord:
if wordGuess.find(letter) == realWord.find(letter)
// 不知道接下来该怎么做
如果有多个正确字母,其中一个字母的位置不对,我该如何检测呢?
比如说,如果实际单词是“lasts”,而有人猜的是“brass”,那么“brass”中的第一个's'是一个正确的字母,但位置不对,而第二个's'是一个正确的字母,并且位置也对。
那么,最好的方法是什么来实现一个函数,检查一个字母是否正确并且位置正确(用'!'标记),或者标记它是一个正确的字母但位置不对(用'~'标记)呢?
1 个回答
要找出不管位置的共同字母:
In [1]: set('harpy') & set('happy')
Out[1]: set(['a', 'h', 'p', 'y'])
要获取一个布尔值标志,表示'happy'中的每个字母在'harpy'中是否存在,不管位置如何:
In [17]: [l in 'happy' for l in 'harpy']
Out[17]: [True, True, False, True, True]
在上面的代码中,可以用第一个代码块中的集合交集来替换'happy'。
最后,要获取一个布尔值标志,表示每个位置的字母是否在正确的位置:
In [2]: [l==r for l,r in zip('happy','harpy')]
Out[2]: [True, True, False, True, True]
将以上内容结合起来,形成一个完整的解决方案:
In [49]: real='lasts'
In [50]: guess='brass'
In [51]: exact=[l==r for l,r in zip(real,guess)]
In [52]: approx=[l in real for l in guess]
In [53]: chars=[[' ','~'],['!','!']]
In [54]: print guess, '\n', ''.join(chars[e][a] for e,a in zip(exact,approx))
brass
~~!
(如果你在想用布尔值来索引数组,它们会被隐式转换为整数:False=0 和 True=1。)