2016-03-08 92 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