Python中的Anagram代码 - 将动态生成的字符串与txt文件进行比较

时间:2011-07-27 17:20:54

标签: python io anagram

我用Python编写了一个Anagram求解程序。我想知道我是否做得对。让我解释一下逻辑:

  1. 首先,用户提供他/她想要为其生成单个单词anagram的两个单词的输入(2个字符串值)
  2. 这两个是连接的,并且有第三个值派生。
  3. 第三个值由itertools.permutations函数处理,其中单词的所有可能排列都作为列表派生。
  4. 使用从列表派生的字符串值格式化列表。
  5. 此时,我打开了一个单词列表,用作字典来比较字符串值是否为实际单词。
  6. 逐行读取文件,并将字符串值与行进行比较。
  7. 如果找到匹配项,则程序会在屏幕上将输出打印为字典匹配
  8. 请告诉我我是否正确处理或是否可以提出任何改进建议。任何反馈意见。我是Python的新手。

    以下是代码:

        #This program has been created to solve anagram puzzles
    
    # All the imports go here
    #import re
    import itertools
    import fileinput
    
    def anaCore():
        print 'This is a Handy-Dandy Anagram Solving Machine'
        print 'First, we enter the first word....'
        anaWordOnly = False
    
        firstWord = raw_input('Please enter the first word > ')
        print 'Thank you for entering %r as your first word' % firstWord
        print 'Now we enter the second word....'
        secondWord = raw_input('Please enter the second word > ')
        print 'Thank you for entering %r as your second word' % secondWord
    
        thirdWord = firstWord+secondWord
    
        print thirdWord
    
        mylist = itertools.permutations(thirdWord)
    
        for a in mylist:
            #print a
            mystr = ''.join(a)
            for line in fileinput.input("brit-a-z.txt"):       
                if mystr in line:
                    print 'Dictionary match found', mystr
            #print mystr
    
    anaCore()
    

4 个答案:

答案 0 :(得分:1)

你为什么要做mystr =''.join(a)?为什么不做mystr = a

我不认为if mystr in line:也是正确的,因为你可能有mystr,例如'dog',并且行为'dogger bank',或类似的东西。您应该检查是否相等。

除此之外,我看不出任何错误。

如果你想要聪明,你可以创建一个第2,第3,第4,......第n个字典,包含初始字典和字典n - 1中所有单词组合。这样你就可以找到多字形字谜。不要让n变得太大,否则字典会占用大量空间。

答案 1 :(得分:1)

当然,您可以生成所有单词的排列。但是,我认为对单词中的字母进行排序会更方便。因此,您必须预处理整个字典,即对每个单词中的字母进行排序。然后,您只需要检查已排序的字符序列。

简化:我会生成你的字谜词的排序顺序。对于文件中的每一行,我会对它的字符进行排序,并检查两者是否相同。如果是,请检查它们是否是相同的单词。如果它们不是相同的词,那么它们就是字谜。

答案 2 :(得分:1)

我的一些想法:

当前的方法是首先生成'thirdWord'的所有可能的排列,然后对于每个排列,通过每次读取文本文件来检查它是否存在于字典中。

您也可以在程序开始时只读取一次字典文件,将单词放入“set”中。然后,您可以使用“in”轻松检查集合中是否存在排列:

>>> a = set(['hello','world','this','is','set'])
>>> 'hello' in a
True
>>> 'python' in a
False
>>>

另外,对于一些长的“第三个字”,它会产生太多的排列。例如,对于长度为16且包含所有不同字母的单词,它将生成16! = 20,922,789,888,000个排列。这有点大。

您可以通过在字典中迭代单词来反转该过程,并检查每个单词是否为带有“thirdWord”的字谜。对于更长的单词,这应该比检查所有排列更快。

检查字谜很简单:

>>> sorted('abc') == sorted('bca')
True
>>> sorted('aab') == sorted('xxx')
False

答案 3 :(得分:0)

你的方法很好;在字符串上调用itertools.permutations是查找匹配项的好方法。这里只是一些想法/改进

  • mylist = itertools.permutations(thirdWord):记住permutations不会返回列表 - 它返回一个生成器,它消耗一定量的内存(相对于排列的数量)并按需生成新的排列。特别是,当您遍历生成器时,您一次只能生成一个排列。此外,生成器只能在正向生成值 - 通常不能在生成器上向后迭代。生成器是Python中的关键概念。有关详细信息,请参阅http://wiki.python.org/moin/Generators
  • 请记住,字符串比较区分大小写。假设您的字典文件是小写的,您应该小写输入。 s.lower()返回字符串s的小写副本。
  • 您的字典查找算法效率低下。再看看你的循环。你的外循环检查每个字符的排列,所以它将运行n! n是输入长度的时间。但是对于每个排列,您再次读取文件中的每一行。如果你的字典中有m个单词,你的程序需要O(n!* m)工作。如果只是将字典文件加载到Python set中,那么查找每个排列的时间就是O(1)。所以你的总运行时间是O(n!)。