带有字谜的Python字符串

时间:2016-03-08 23:46:01

标签: python string anagram

此时此代码从用户处获取一个字符串,并将其与存储了许多单词的文本文件进行比较。然后它输出包含与字符串完全匹配的所有单词。 (E.G" otp = opt,top,pot)目前,当我输入字符串时,它只匹配字符串与重新排列顺序中相同字母的单词匹配。

我的问题是我如何能够键入多余的字母,但仍然输出所有包含的单词?例如:键入" orkignwer"并且程序将输出" working"即使有额外的字母。

words = []


def isAnAnagram(word, user):
    wordList= list(word)
    wordList.sort()
    inputList= list(user)
    inputList.sort()
    return (wordList == inputList)

def getAnagrams(user):
    lister = [word for word in words if len(word) == len(user) ]
    for item in lister:
        if isAnAnagram(item, user):
            yield item


with open('Dictionary.txt', 'r') as f:
    allwords = f.readlines()
f.close()

for x in allwords:
    x = x.rstrip()
    words.append(x)
inp = 1


while inp != "99":
    inp = input("enter word:")
    result = getAnagrams(inp)
    print(list(result))     

1 个答案:

答案 0 :(得分:1)

您必须修改isAnAnagramgetAnagrams功能。首先应编辑getAnagrams函数,以便在lister列表中包含更长的单词:

def getAnagrams(user):
    lister = [word for word in words if len(word) <= len(user) ]
    for item in lister:
        if isAnAnagram(item, user):
            yield item

然后您需要编辑isAnAnagram功能。正如Alexander Huszagh指出的那样,您可以使用collections包中的计数器:

from collections import Counter

def isAnAnagram(word, user):
    word_counter = Counter(word)
    input_counter = Counter(user)
    return all(count <= input_counter[key] for key, count in word_counter.items())

all(count <= input_counter[key] for key, count in word_counter.items())检查word中每个user字母是否至少出现在word中的次数。

P.S。如果您想要更优化的解决方案,您可能需要签出TRIE(例如MARISA-trie,python-trie或PyTrie)。