2016-03-08 152 views
1

此时此代码从用户处获取一个字符串,并将其与存储多个单词的文本文件进行比较。然后将包含完全匹配的所有单词输出到字符串。 (EG“otp = opt,top,pot)目前,当我输入字符串时,它只匹配字符串与重排顺序中的相同的完全相同的字母。类型超过信件,但仍输出包含的所有单词,例如:键入“orkignwer”,并计划将输出“工作”,即使有多余的字母带字符串的Python字符串

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

您可能想要使用'Counter',然后检查输入单词是否包含所有相同的字母('a.keys()== b.keys()'),并且每个字母的计数较高或相等'b [k]> v for k,v in a.items()'。 –

+1

另外:请记住,使用'with'时不需要关闭文件。 – cdonts

回答

1

你必须编辑isAnAnagram。和getAnagrams函数。首先编辑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函数。正如亚历山大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)。

+0

谢谢大家。我用你的代码更改bbkglb,但它仍然不会输出我所需要的。我需要的是,例如,如果我输入“tpozxc”,prog会意识到这里有3个单词,并输出“opt,top,pot” 但是,发生的情况是只输出完全匹配的字符串一个重新排列的顺序,所以要获得顶级选择和锅我需要输入一个字符串只有这些字母的组合。 – CBren

+0

@CBren哦,我明白了,我误解了你的问题。我编辑了这两个函数。这应该解决它。 – bbkglb