Перекрывающиеся значения строк в Python - PullRequest
0 голосов
/ 22 апреля 2019

Я строю игру-головоломку в Python.У меня есть правильное слово-загадка и угаданное слово-загадка.Я хочу построить третью строку, которая показывает правильные буквы в угаданной загадке в правильном слове загадки и _ в положении неправильных букв.

Например, допустим, что правильным словом является APPLE, а угаданное слово - APTLE, тогда я хочу получить третью строку: AP_L_

Гаданное слово и правильное слово:гарантированно будет от 3 до 5 символов, но угаданное слово не обязательно будет иметь ту же длину, что и правильное слово

Например, правильное слово TEA и угаданное слово TEAKO, тогдатретья строка должна быть TEA__, потому что игроки угадали последние две буквы неправильно.

Другой пример, правильное слово APPLE и предполагаемое слово POP, третья строка должна быть:

_ _ P_ _ (без пробела)

Iможет успешно получить сопоставленные индексы правильного и угаданного слова;Однако у меня проблемы со сборкой третьей строки.Я только что узнал, что строки в 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")

выходной результатсейчас список из пяти "_"

случаев:

  1. правильное слово APPLE и предполагаемое слово APTLE третья строка: AP_L_
  2. правильное слово TEA и предполагаемое слово TEAKO, третья строка должна быть TEA__
  3. правильное слово APPLE и предполагаемое слово POP, третья строка должна быть _ _ P_ _

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

Вы можете использовать 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__
0 голосов
/ 22 апреля 2019

Пара вещей здесь.

str.replace () не заменяет встроенный; как вы отметили, строки являются неизменяемыми, поэтому вы должны назначить результат замены:

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

Однако нет смысла делать это, так как вы можете просто назначить элемент списка:

result[value] = str_a[value]

И, наконец, вы можете назначить список длиной str_a без цикла for, который может быть более читабельным:

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