【问题标题】:Overlapping values of strings in PythonPython中字符串的重叠值
【发布时间】:2019-04-22 15:22:23
【问题描述】:

我正在用 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")

现在的输出结果是五个“_”的列表

案例:

  1. 正确的单词是APPLE,猜出的单词是APTLE第三 字符串:AP_L_
  2. 正确的单词是TEA,猜到的单词是TEAKO, 第三个字符串应该是TEA__
  3. 正确的单词是APPLE并且猜到了 单词是POP,第三个字符串应该是_ _ P_ _

【问题讨论】:

  • 如果您将整个程序的代码包含在内并缩短您的问题以使其更精确,那么问题可能会更容易理解。

标签: python-3.x string immutability string-comparison


【解决方案1】:

您可以在此处使用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__

【讨论】:

    【解决方案2】:

    这里有几件事。

    str.replace() 不替换内联;正如您所指出的,字符串是不可变的,因此您必须分配替换的结果:

    result[value] = result[value].replace('_', str_a[value])
    

    但是,这样做没有意义,因为您可以分配给列表元素:

    result[value] = str_a[value]
    

    最后你可以分配一个不带for循环的str_a长度列表,这可能更具可读性:

    result = ['_'] * len(str_a)
    

    【讨论】:

      猜你喜欢
      • 2014-11-01
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 2018-04-30
      • 1970-01-01
      • 2013-07-03
      • 2017-08-05
      相关资源
      最近更新 更多