Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中:如何让我的代码根据输入打印出所有可能拼写的单词?_Python_Python 3.x - Fatal编程技术网

在Python中:如何让我的代码根据输入打印出所有可能拼写的单词?

在Python中:如何让我的代码根据输入打印出所有可能拼写的单词?,python,python-3.x,Python,Python 3.x,我想我已经接近找到如何根据用户输入从我的词典中打印出所有可能的单词了。这是基于用户输入是“艺术”的假设,因此我字典中可能的单词是艺术、老鼠、塔特和焦油,但只有三个字母组合被打印出来。谁能告诉我哪里出了问题?谢谢 Dictionary = ["tar","art","tart","rat"] #creates dictionary of set words StoredLetters = input('input your word here: ') #allows the user to inp

我想我已经接近找到如何根据用户输入从我的词典中打印出所有可能的单词了。这是基于用户输入是“艺术”的假设,因此我字典中可能的单词是艺术、老鼠、塔特和焦油,但只有三个字母组合被打印出来。谁能告诉我哪里出了问题?谢谢

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))

根据后续评论,规则是我们必须使用目标词中的所有字符,但我们可以根据需要多次使用每个字符

我将lookup“dictionary”数据结构设置为Python
dict
,它将每个字典单词中作为元组的排序、唯一字符映射到可以由这些字符组成的实际单词列表

接下来,我将按如下方式处理查找:

  • 对用户输入的唯一字符(目标单词)进行排序,并将其索引到字典中,以获得它可以生成的单词列表。使用
    集合
    意味着我们允许重复,对字符进行排序意味着我们对这些字母的所有可能排列进行规范化
  • 仅上述内容就可能产生误报,因此我们过滤结果词列表,以删除任何比目标词短的实际结果词。这可以确保我们正确处理像
    “artt”
    这样的目标词,并防止它与
    “art”
    匹配
代码:

输出:

art=>['tar','art','tart','rat']
artt=>['tart']
ar=>[]
arttt=>[]
aret=>[]
原始代码中的问题在其他答案中得到了很好的解决。逻辑似乎并不清晰,因为它将字符与单词进行比较,变量名通常与代码所表示的逻辑不匹配


使用频率计数器是可以的,但在字典中迭代时会遇到困难,需要检查字典单词中每个字符的计数是否大于目标单词中相应的计数。我怀疑我提供的代码是否最优,但我认为它应该比反向方法快得多。

根据后续评论,规则是我们必须使用目标词中的所有字符,但我们可以根据需要多次使用每个字符

我将lookup“dictionary”数据结构设置为Python
dict
,它将每个字典单词中作为元组的排序、唯一字符映射到可以由这些字符组成的实际单词列表

接下来,我将按如下方式处理查找:

  • 对用户输入的唯一字符(目标单词)进行排序,并将其索引到字典中,以获得它可以生成的单词列表。使用
    集合
    意味着我们允许重复,对字符进行排序意味着我们对这些字母的所有可能排列进行规范化
  • 仅上述内容就可能产生误报,因此我们过滤结果词列表,以删除任何比目标词短的实际结果词。这可以确保我们正确处理像
    “artt”
    这样的目标词,并防止它与
    “art”
    匹配
代码:

输出:

art=>['tar','art','tart','rat']
artt=>['tart']
ar=>[]
arttt=>[]
aret=>[]
原始代码中的问题在其他答案中得到了很好的解决。逻辑似乎并不清晰,因为它将字符与单词进行比较,变量名通常与代码所表示的逻辑不匹配


使用频率计数器是可以的,但在字典中迭代时会遇到困难,需要检查字典单词中每个字符的计数是否大于目标单词中相应的计数。我怀疑我提供的代码是否是最佳的,但我认为它应该比反向方法快得多。

似乎有一些因素可以促成这一点

  • 在main
    allwords(StoredLetters,Dictionary)
    中调用时,您正在交换所有单词
    def allwords(Dictionary,StoredLetters)上的参数:
    。如果不指定名称(在python中查找命名参数),您将交换输入

  • characters
    函数中,您似乎正在重置字典变量。创建新变量时,请尝试使用唯一的名称。这会导致在调用
    字符(word)
    时,您在顶部设置的单词词典被清空


  • 似乎有一些因素可能会导致这种情况

  • 在main
    allwords(StoredLetters,Dictionary)
    中调用时,您正在交换所有单词
    def allwords(Dictionary,StoredLetters)上的参数:
    。如果不指定名称(在python中查找命名参数),您将交换输入

  • characters
    函数中,您似乎正在重置字典变量。创建新变量时,请尝试使用唯一的名称。这会导致在调用
    字符(word)
    时,您在顶部设置的单词词典被清空


  • 首先,变量
    StoredLetters
    的名称同时也是
    all_words
    函数的一个参数的名称,这会使事情变得混乱

    其次,您实际上是在传递
    StoredLetters
    ,它是
    art
    ,作为函数的第二个参数,因此它是函数中的
    wordSet
    ,而不是
    StoredLetters

    您应该通过使用不同的变量名来让事情变得更加清楚,并让它清楚地显示您在哪个参数中使用了什么<代码>单词不是真正的单词,它是一本以字母为键的字典,以及它们作为值出现的次数!使代码清晰易懂对于使其易于理解有很大的帮助
    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)}")