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

2 投票
1 回答
1253 浏览
提问于 2025-04-16 17:56

我正在用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 个回答

5

要找出不管位置的共同字母:

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。)

撰写回答