Список всех изменений от word1 до word2 (через Левенштейна) - PullRequest
0 голосов
/ 17 января 2020

Есть ли способ показать конкретные шаги изменения преобразования слова? Например:

import Levenshtein as leven 

word1 = "man"
word2 = "scotsman"

# desired output
leven.???(word1,word2) = ['sman','tsman','otsman','cotsman','scotsman']

1 Ответ

0 голосов
/ 17 января 2020

Приведенный ниже код будет делать то, что вы хотите, когда более длинная строка (я назвал ее haystack, начинается или заканчивается короткой строкой (needle). Порядок параметров word1 и word2 не имеет значения .

NB Эта функция не работает, когда игла находится в середине строки, поскольку это может вызвать другие проблемы (например, что делать, если подстрока встречается несколько раз?).

word1 = "man"
word2 = "scotsman"

def changeSteps(word1, word2):

    needle = word1 if len(word1) < len(word2) else word2
    haystack = word1 if len(word1) > len(word2) else word2

    if haystack.endswith(needle):
        reverse=True
    else:
        reverse = False

    if needle in haystack:
        difference = haystack.replace(needle, "")

        if reverse:
            difference = ''.join(reversed(difference))
            needle = ''.join(reversed(needle))

        steps = [needle+difference[0:i] for i in range(1,len(difference)+1)]

        if reverse:
            steps = [ ''.join(reversed(s)) for s in steps ]

        return steps

    else:
        return []


print(changeSteps(word1, word2))

РЕДАКТИРОВАТЬ: Также имейте в виду, что, когда строка начинается и заканчивается с needle, который вы указали для поиска, функция рассчитает шаги изменения для , заканчивающихся иглой case.

...