我想我已经快要弄清楚如何根据用户输入的字典打印出所有可能的单词了。它基于这样的假设:用户输入的是' 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))
发布于 2020-05-29 04:51:21
根据后续评论,规则是我们必须使用目标单词中的所有字符,但我们可以多次使用每个字符。
我将查找“字典”数据结构设置为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)}")
输出:
art => ['tar', 'art', 'tart', 'rat']
artt => ['tart']
ar => []
arttt => []
aret => []
原始代码中的问题已经在其他答案中得到了很好的解决。逻辑看起来并不清楚,因为它是将字符与单词进行比较,而变量名通常与代码表示的逻辑不匹配。
使用频率计数器是很好的,但是您将不得不迭代字典,并且您需要检查字典单词中的每个字符计数是否大于目标单词中的相应计数。我怀疑我提供的代码是最优的,但我认为它应该比反方法快得多。
发布于 2020-05-29 04:56:43
似乎有一些事情可以对此做出贡献。
allwords(StoredLetters, Dictionary)
中调用它时,你正在交换所有单词def allwords(Dictionary, StoredLetters):
上的参数。如果不指定名称(在python中查找命名参数),您将交换输入。characters
函数中,您将重置字典变量。尝试在创建新变量时使用唯一的名称。当characters(word)
被调用时,这会导致在顶部设置的单词字典被清空
发布于 2020-05-29 05:03:48
首先,将变量StoredLetters
的名称也作为all_words
函数的一个参数的名称,这会使事情变得混乱。
其次,您实际上传入了StoredLetters
,即art
,作为函数的第二个参数,因此函数中的参数是wordSet
,而不是StoredLetters
!
你真的应该通过使用不同的变量名来让事情变得更清楚,并让你对哪个参数使用什么变得明显。words
并不是真正的单词,它是一个以字母为键的字典,以及它们作为值出现了多少次!让代码清晰易懂对于简化调试有很大的帮助。你有word
,StoredLetters
,wordSet
,另一个StoredLetters
参数,words = characters(word)
,它不会做预期的事情。这一切都需要一个良好的清理。
至于功能,对于art
,每个字母只出现一次,因此对于具有两次t
的tart
,if wordSet.count(key) != words[key]
的计算结果为True,标志将设置为0,并且不会打印单词。
希望这对你有所帮助,祝你编码愉快!
https://stackoverflow.com/questions/62078864
复制