如何在文本文件中搜索给定单词

时间:2016-05-13 00:15:53

标签: python python-3.x dictionary file-io anagram

我必须在文本文件中搜索给定单词的字谜。文本文件每行有一个单词。到目前为止,我已经设法编写了一个函数,该函数根据给定的单词生成一个字典,其中的键是单词中的一个字母,它的值是字母在单词中的次数。第二个函数循环遍历文本文件的每一行,创建具有相同键和值的第二个字典,并比较两者。如果两者相等,则该函数会将该单词添加到列表中。一旦函数完成循环遍历文本文件,它应该打印字谜列表,但它打印一个空白列表。这是我的代码,我不知道它出了什么问题。

这是用于创建给定单词的字典。

word= input("Enter a word: ")
letterdict = {}

def count_letters(word,letterdict):
    for letter in word:
        letterdict[letter] = letterdict.get(letter,0) + 1
    return letterdict

print(count_letters(word,letterdict))

这是为了循环文本文件并进行比较

def search():
    count_letters(word,letterdict)
    anagrams = []
    letterdict2={}
    f = open('EnglishWords.txt', 'r')
    for letter in f:
        letterdict2[letter] = letterdict2.get(letter,0) + 1
        if letterdict == letterdict2:
            anagrams.append[f]
        letterdict2.clear()
    f.close()
    anagrams.sort() #put list in alphabetical order

    return print(anagrams)

search()

2 个答案:

答案 0 :(得分:4)

更快的算法(在循环内部,无论如何):只需翻阅整个字典一次,创建一个每行两个单词的新文件;第一个是带字母按字母顺序排列的单词,然后是单词本身,例如:

aaadkrrv aardvark
aabcsu abacus
. . .

然后,对该文件进行排序。现在,查找单词的所有字谜就是直接查找排序列表。

答案 1 :(得分:0)

这看起来像是一个不使用global关键字来访问(和写入)您创建的letterdict的问题。在本地声明您的变量并使用函数参数将它们传递给您的程序。 Python不提供强大的全局变量支持(它就在那里,但需要注意细节才能使用)。

考虑重写你的功能:

def count_letters(word):
    letterdict = dict()
    for letter in word:
        letterdict[letter] = letterdict.get(letter,0) + 1
    return letterdict

def search(word):
    letterdict = count_letters(word)
    anagrams = []
    letterdict2={}
    with open('EnglishWords.txt', 'r') as f:
        for line in f:
            for letter in line:
                letterdict2[letter] = letterdict2.get(letter,0) + 1
                if letterdict == letterdict2:
                    anagrams.append[line]
                letterdict2.clear()
    anagrams.sort() #put list in alphabetical order

return anagrams

关于原始代码的一些注释:

  • return print(anagrams)可能没有做任何事情,似乎是代码中的语法错误。
  • for letter in f:将文件的行加载到letter
  • count_letters(word,letterdict)对计算值
  • 不执行任何操作
  • 您可能/可能不希望在letterdict
  • 中包含空格和数字