我正在用Python构建拼图文字游戏。我有正确的拼图单词,以及猜到的拼图单词。我想建立一个第三个字符串,在正确的拼图字中显示猜测拼图中的正确字母,并在不正确字母的位置显示_。
例如,说正确的单词是APPLE
,猜测的单词是APTLE
然后我想要第三个字符串:AP_L_
猜测的单词和正确的单词保证长度为3到5个字符,但猜测的单词不能保证与正确的单词长度相同
例如,正确的单词是TEA
,猜测的单词是TEAKO
,那么第三个字符串应该是TEA__
,因为玩家猜错了最后两个字母。
另一个例子,正确的单词是APPLE
,猜测的单词是POP
,第三个字符串应该是:
_ _ P_ _
(没有空间分隔)
我可以成功获得正确和猜测的单词的匹配索引;但是,我在构建第三个字符串时遇到问题。我刚学会Python中的字符串是不可变的,我不能分配像str1[index] = str2[index]
这样的东西
我尝试了很多东西,包括使用列表,但我没有得到正确的答案。附上的代码是我最近的尝试,请你帮我解决一下?
谢谢
找到puzzle_word和guess之间的匹配
def matcher(str_a, str_b):
#find indexes where letters overlap
matched_indexes = [i for i, (a, b) in enumerate(zip(str_a, str_b)) if a == b]
result = []
for i in str_a:
result.append('_')
for value in matched_indexes:
result[value].replace('_', str_a[value])
print(result)
matcher("apple", "allke")
现在的输出结果是五个“_”的列表
案例:
APPLE
和猜测的词是APTLE
第三串:AP_L_
TEA
和猜测的词是TEAKO
,第三个字符串应该是TEA__
APPLE
和猜测的词是POP
,第三个字符串应该是_ _ P_ _
你可以在这里使用itertools.zip_longest
来确保你填写所提供的最长的单词,然后通过连接匹配的字符或其他_
创建一个新的字符串。例如:
from itertools import zip_longest
correct_and_guess = [
('APPLE', 'APTLE'),
('TEA', 'TEAKO'),
('APPLE', 'POP')
]
for correct, guess in correct_and_guess:
# If characters in same positions match - show character otherwise `_`
new_word = ''.join(c if c == g else '_' for c, g in zip_longest(correct, guess, fillvalue='_'))
print(correct, guess, new_word)
将打印以下内容:
APPLE APTLE AP_LE
TEA TEAKO TEA__
APPLE POP __P__
这里有几件事。
str.replace()不替换内联;正如您所指出的,字符串是不可变的,因此您必须分配replace的结果:
result[value] = result[value].replace('_', str_a[value])
但是,这样做是没有意义的,因为您可以只分配给list元素:
result[value] = str_a[value]
最后,您可以在没有for循环的情况下分配str_a
长度的列表,这可能更具可读性:
result = ['_'] * len(str_a)