簡體   English   中英

在 Python 中:如何讓我的代碼根據我的輸入打印出我可以拼寫的所有可能的單詞?

[英]In Python: How can i get my code to print out all the possible words I can spell based on my input?

我想我已經接近弄清楚如何根據我的詞典中的用戶輸入打印出所有可能的單詞。 它基於用戶輸入是“ART”的假設,所以我的字典中可能的單詞是 ART、RAT、TART 和 TAR,但只有三個字母組合被打印出來。 誰能告訴我哪里出錯了? 謝謝!

Dictionary = ["tar","art","tart","rat"] #creates dictionary of set words
StoredLetters = input('input your word here: ') #allows the user to input any word
list(StoredLetters)

def characters(word):
    Dictionary = {}
    for i in word:
        Dictionary[i] = Dictionary.get(i, 0) + 1
    return Dictionary

def all_words(StoredLetters, wordSet):
    for word in StoredLetters:
        flag = 1
        words = characters(word)
        for key in words:
            if key not in wordSet:
                flag = 0
            else:
                if wordSet.count(key) != words[key]:
                    flag = 0
        if flag == 1:
            print(word)
if __name__ == "__main__":
    print(all_words(Dictionary, StoredLetters))

根據后續評論,規則是我們必須使用目標詞中的所有字符,但我們可以根據需要多次使用每個字符。

我將查找“字典”數據結構設置為 Python dict ,它將每個字典單詞中作為元組的排序的唯一字符映射到可以由這些字符形成的實際單詞列表。

接下來,我將按如下方式處理查找:

  • 對用戶輸入的唯一字符(目標詞)進行排序並索引到字典中以獲取它可以生成的詞列表。 使用set意味着我們允許重復和排序字符意味着我們對這些字母的所有可能排列進行規范化。
  • 僅以上內容可能會產生誤報,因此我們過濾結果單詞列表以刪除任何比目標單詞短的實際結果單詞。 這可以確保我們正確處理像"artt"這樣的目標詞,並防止它匹配"art"

代碼:

from collections import defaultdict

class Dictionary:
    def __init__(self, words):
        self.dictionary = defaultdict(list)

        for word in words:
            self.dictionary[tuple(sorted(set(word)))].append(word)

    def search(self, target):
        candidates = self.dictionary[tuple(sorted(set(target)))]
        return [x for x in candidates if len(x) >= len(target)]

if __name__ == "__main__":
    dictionary = Dictionary(["tar", "art", "tart", "rat"])
    tests = ["art", "artt", "ar", "arttt", "aret"]

    for test in tests:
        print(f"{test}\t=> {dictionary.search(test)}")

Output:

art     => ['tar', 'art', 'tart', 'rat']
artt    => ['tart']
ar      => []
arttt   => []
aret    => []

原始代碼中的問題已在其他答案中得到很好的解決。 邏輯似乎並不清晰,因為它將字符與單詞進行比較,並且變量名稱通常與代碼表示的邏輯不匹配。

使用頻率計數器很好,但是您將被困在對字典的迭代中,並且您需要檢查字典單詞中每個字符的計數是否大於目標單詞中的相應計數。 我懷疑我提供的代碼是最優的,但我認為它應該比計數器方法快得多。

似乎有一些事情可以促成這一點。

  1. 當您在 main allwords(StoredLetters, Dictionary)中調用它時,您正在交換所有單詞def allwords(Dictionary, StoredLetters):的參數。 如果不指定名稱(在 python 中查找命名參數),您將交換輸入。

  2. characters function 中,您似乎正在重置字典變量。 在創建新變量時嘗試使用唯一名稱。 這會導致您在頂部設置的單詞字典在調用characters(word)時被清空

首先,您的變量StoredLetters的名稱也是您的all_words function 的 arguments 之一的名稱,這讓您感到困惑。

其次,您實際上是傳入StoredLetters ,即art ,作為 function 的第二個參數,所以它是wordSet中的 wordSet,而不是StoredLetters

你真的應該通過使用不同的變量名來讓事情更清楚,並讓你清楚地知道你在使用哪個參數。 words不是真正的單詞,它是一個以字母為鍵的字典,以及它們作為值出現的次數。 使代碼清晰易懂對易於調試大有幫助。 你有wordStoredLetterswordSet ,另一個StoredLetters參數, words = characters(word)沒有做預期的事情。 這都可以使用良好的清理。

至於功能,對於art ,每個字母只出現一次,所以對於tart ,它有t兩次, if wordSet.count(key) != words[key]將評估為 True,並且 flag 將設置為 0,並且這個詞不會被打印出來。

希望對您有所幫助,並祝您編碼愉快!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM