我的函数首先计算给定单词的所有可能的字谜。然后,对于这些字谜中的每一个,它检查它们是否是有效单词,但检查它们是否等于wordlist.txt文件中的任何单词。该文件是一个包含大量单词的巨型文件。所以我决定只阅读每一行并检查每个anagram是否存在。然而,它出现了空白。这是我的代码:
def perm1(lst):
if len(lst) == 0:
return []
elif len(lst) == 1:
return [lst]
else:
l = []
for i in range(len(lst)):
x = lst[i]
xs = lst[:i] + lst[i+1:]
for p in perm1(xs):
l.append([x] + p)
return l
def jumbo_solve(string):
'''jumbo_solve(string) -> list
returns list of valid words that are anagrams of string'''
passer = list(string)
allAnagrams = []
validWords = []
for x in perm1(passer):
allAnagrams.append((''.join(x)))
for x in allAnagrams:
if x in open("C:\\Users\\Chris\\Python\\wordlist.txt"):
validWords.append(x)
return(validWords)
print(jumbo_solve("rarom"))
如果要调试许多print语句,并且传入的列表“allAnagrams”完全正常。例如,使用输入“rarom,一个有效的anagram是单词”armor“,它包含在wordlist.txt文件中。但是,当我运行它时,它不会检测是否由于某种原因。再次感谢,我'我仍然对Python有点新意,所以感谢所有的帮助,谢谢!
答案 0 :(得分:2)
你错过了一个微小但重要的方面:
word in open("C:\\Users\\Chris\\Python\\wordlist.txt")
这将逐行搜索文件,就像使用了open(...).readlines()
一样,并尝试匹配整行,与 '\n'
结尾< / strong>即可。实际上,任何需要迭代open(...)
的内容都可以像readlines()
一样工作。
你需要
x+'\n' in open("C:\\Users\\Chris\\Python\\wordlist.txt")
如果文件是单独行上的单词列表,以使其能够修复您所拥有的内容,但在每个函数调用上执行此操作都是低效的。最好做一次:
wordlist = open("C:\\Users\\Chris\\Python\\wordlist.txt").read().split('\n')
如果文件是'\n'
分隔的单词列表,则会创建单词列表。请注意,您可以使用
`readlines()`
而不是read().split('\n')
,但这会使\n
保留在每个单词上,就像您所拥有的那样,并且您需要在搜索中包含该内容,如上所示。现在,您可以将列表用作全局变量或函数参数。
if x in wordlist: stuff
注意Graphier在评论中提出了一个重要的建议。一套:
wordlist = set(open("C:\\Users\\Chris\\Python\\wordlist.txt").read().split('\n'))
更适合单词查找而不是列表,因为它是O(字长)。
答案 1 :(得分:0)
您以错误的方式使用了以下代码:
if x in open("C:\\Users\\Chris\\Python\\wordlist.txt"):
相反,请尝试以下代码,它应该可以解决您的问题:
with open("words.txt", "r") as file:
lines = file.read().splitlines()
for line in lines:
# do something here
答案 2 :(得分:0)
因此,将所有建议放在一起,您的代码可以像以下一样简单:
from itertools import permutations
def get_valid_words(file_name):
with open(file_name) as f:
return set(line.strip() for line in f)
def jumbo_solve(s, valid_words=None):
"""jumbo_solve(s: str) -> list
returns list of valid words that are anagrams of `s`"""
if valid_words is None:
valid_words = get_valid_words("C:\\Users\\Chris\\Python\\wordlist.txt")
return [word for word in permutations(s) if word in valid_words]
if __name__ == "__main__":
print(jumbo_solve("rarom"))