Python-替换字符串上特定位置出现的所有字母

Python-替换字符串上特定位置出现的所有字母,python,string,Python,String,尝试用Python创建电视游戏节目“行话” 在游戏中,玩家试图猜一个五个字母的单词。他们从我随机猜一个五个字母的单词开始。然后,游戏板将亮起,显示他们猜测的单词与实际单词的匹配情况 例如,如果真实单词是“峡谷”,玩家猜测“鹰”——棋盘将显示“e”和“g”在真实单词中,但它们相对于真实单词“峡谷”的位置不正确。(g在[0]和[3]索引中,而在鹰中它们在[2]索引中) 如果单词是“happy”,而用户猜到了“harpy”,那么黑板会显示其中三个字母是真实单词,并且位置正确。(h-a-y) 在Pyth

尝试用Python创建电视游戏节目“行话”

在游戏中,玩家试图猜一个五个字母的单词。他们从我随机猜一个五个字母的单词开始。然后,游戏板将亮起,显示他们猜测的单词与实际单词的匹配情况

例如,如果真实单词是“峡谷”,玩家猜测“鹰”——棋盘将显示“e”和“g”在真实单词中,但它们相对于真实单词“峡谷”的位置不正确。(g在[0]和[3]索引中,而在鹰中它们在[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”是正确的字母和位置


那么,实现一个函数的最佳方法是什么?该函数可以检查一个字母是否正确且位置正确(并用a表示!),或者用a ~

表示它是一个正确的字母,位置错误,以查找普通字母,而不考虑位置:

In [1]: set('harpy') & set('happy')
Out[1]: set(['a', 'h', 'p', 'y'])
In [17]: [l in 'happy' for l in 'harpy']
Out[17]: [True, True, False, True, True]
In [2]: [l==r for l,r in zip('happy','harpy')]
Out[2]: [True, True, False, True, True]
要获取布尔标志,指示“harpy”的每个字母是否在“happy”中的任何位置出现:

In [1]: set('harpy') & set('happy')
Out[1]: set(['a', 'h', 'p', 'y'])
In [17]: [l in 'happy' for l in 'harpy']
Out[17]: [True, True, False, True, True]
In [2]: [l==r for l,r in zip('happy','harpy')]
Out[2]: [True, True, False, True, True]
在上面的代码中,“happy”可以替换为第一个代码段中的集合交集

最后,要获取每个位置的布尔标志,指示字母是否位于正确位置:

In [1]: set('harpy') & set('happy')
Out[1]: set(['a', 'h', 'p', 'y'])
In [17]: [l in 'happy' for l in 'harpy']
Out[17]: [True, True, False, True, True]
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。)

布尔标记技术有助于查找直接匹配项,但它无助于确定“guessWord”中的字母是否位于“realWord”中,而只是位置不正确。同样重要的是要注意,realWord可能比guessWord中出现多个字母。我使用这段代码来完成“zip”方法所做的工作:“allMatches=[match.start(),for match in re.finditer(re.escape(wordGuess),realWord)]”稍微有用一些,因为它返回了找到的每个字母的起始索引