Python 中字符串的重叠值
Overlapping values of strings in Python
我正在 Python 中构建一个益智文字游戏。我有正确的拼图词和猜出的拼图词。我想构建第三个字符串,它在正确的拼图单词中显示猜出的拼图中的正确字母,并在不正确字母的位置显示 _。
例如,假设正确的单词是 APPLE
,猜中的单词是 APTLE
然后我想要第三个字符串:AP_L_
猜字和正确字保证3到5个字长,但不保证猜字和正确字一样长
例如,正确的单词是TEA
,猜到的单词是TEAKO
,那么第三串应该是TEA__
,因为玩家猜错了最后两个字母。
另一个例子,正确的单词是APPLE
,猜中的单词是POP
,第三个字符串应该是:
_ _ P_ _
(没有space分隔)
我可以成功得到正确和猜到的单词的匹配索引;但是,我在构建第三个字符串时遇到了问题。我刚刚了解到 Python 中的字符串是不可变的,我不能分配 str1[index] = str2[index]
之类的东西
我尝试了很多方法,包括使用列表,但我没有得到正确的答案。附上的代码是我最近的尝试,你能帮我解决这个问题吗?
谢谢
找到 puzzle_word 和猜测
之间的匹配项
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_ _
这里有几件事。
str.replace() 不替换内联;正如您所指出的,字符串是不可变的,因此您必须分配 replace:
的结果
result[value] = result[value].replace('_', str_a[value])
但是,这样做没有意义,因为您只能分配给列表元素:
result[value] = str_a[value]
最后你可以在没有 for 循环的情况下分配长度为 str_a
的列表,这可能更具可读性:
result = ['_'] * len(str_a)
您可以在此处使用 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__
我正在 Python 中构建一个益智文字游戏。我有正确的拼图词和猜出的拼图词。我想构建第三个字符串,它在正确的拼图单词中显示猜出的拼图中的正确字母,并在不正确字母的位置显示 _。
例如,假设正确的单词是 APPLE
,猜中的单词是 APTLE
然后我想要第三个字符串:AP_L_
猜字和正确字保证3到5个字长,但不保证猜字和正确字一样长
例如,正确的单词是TEA
,猜到的单词是TEAKO
,那么第三串应该是TEA__
,因为玩家猜错了最后两个字母。
另一个例子,正确的单词是APPLE
,猜中的单词是POP
,第三个字符串应该是:
_ _ P_ _
(没有space分隔)
我可以成功得到正确和猜到的单词的匹配索引;但是,我在构建第三个字符串时遇到了问题。我刚刚了解到 Python 中的字符串是不可变的,我不能分配 str1[index] = str2[index]
我尝试了很多方法,包括使用列表,但我没有得到正确的答案。附上的代码是我最近的尝试,你能帮我解决这个问题吗?
谢谢
找到 puzzle_word 和猜测
之间的匹配项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_ _
这里有几件事。
str.replace() 不替换内联;正如您所指出的,字符串是不可变的,因此您必须分配 replace:
的结果result[value] = result[value].replace('_', str_a[value])
但是,这样做没有意义,因为您只能分配给列表元素:
result[value] = str_a[value]
最后你可以在没有 for 循环的情况下分配长度为 str_a
的列表,这可能更具可读性:
result = ['_'] * len(str_a)
您可以在此处使用 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__