Hi,

The below script which prints anagrams available for any word available within a given database. It does work, but it is not very fast. I am relatively certain there are more Python friendly coding techniques but I am more concerned with a faster algorithm.

The database item consists of the key; the actual word, and the value, the size as a string. For example, the word 'myth' is represented as key= 'myth', value = '4'. I think the slow part of the algorithm is the script retrieves a list of all database words of length (myth)=4. That's a lot of words. Each word is sorted and then compared to the alpha sorted word. When there is a match, that word becomes a part of the anagram list. Even a very basic look at the word 'myth' shows there are no anagrams. So, to return an empty list, we have scanned all words in the database of size 4.

I will be happy to send the first program and the original word file to anyone who would like to implement the database. I could not attach the database since that made this post way too large.

Any and all suggestions are most welcome.

#!/usr/bin/env python

##The second program is in a perpetual loop waiting on input. A 'Q ' will terminate the program. ##All input is by string; for example the word 'zygote' without the quotes is a request for all possible anagrams
##created from all the letters in 'zygote'.

def get_key(d1, value):
  return [item[0] for item in d1.items() if item[1] == value]

def Get_Anagrams(db,word):
  Alist=list()
  tulip1=tuple(word)
  list1=list(tulip1)
  list1.sort()
  wordlist=get_key(db,str(len(word)))
  for items in wordlist:
      if items != word:
          tulip2=tuple(items)
          list2=list(tulip2)
          list2.sort()
          if list2==list1:
              Alist.append(items)
  if len(Alist)>0:
      return Alist
  else:
      return None


def main():
  import anydbm
  db=anydbm.open('anagram.db','r')
  Repeat=True
  while Repeat != False:
word_in=str(raw_input('Input a word to build anagrams\nA Q will quit the program: '))
      if word_in=='Q':
          Repeat = False
      else:
          if db.has_key(word_in) < 1:
              print word_in,'  is not in the dictionary\n'
          else:
              Anagrams=Get_Anagrams(db,word_in)
              if Anagrams != None:
                  print  'Anagrams for ',word_in,' are ',Anagrams
              else:
                  print word_in,' has no anagrams.'
  db.close
  return 0

if __name__ == '__main__': main()


Thanks,

Robert
_______________________________________________
Tutor maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/tutor

Reply via email to