我用Python编写了一个Anagram求解程序。我想知道我是否做得对。让我解释一下逻辑:
请告诉我我是否正确处理或是否可以提出任何改进建议。任何反馈意见。我是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()
答案 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
的小写副本。set
中,那么查找每个排列的时间就是O(1)。所以你的总运行时间是O(n!)。