anagram finder / dict mapping question

dave squareswallower at 1ya2hoo3.net
Thu May 8 19:52:53 EDT 2008


>> On 2008-05-07 19:25:53 -0600, "Kam-Hung Soh" <kamhung.soh at gmail.com>
> 
>> said:
>> 
>>> On Thu, 08 May 2008 11:02:12 +1000, dave <squareswallower at 1ya2hoo3.ne
> t>
>>> wrote:
>>> 
>>>> Hi All,
>>>>  I wrote a program that takes a string sequence and finds all the wo
> rds
>>> 
>>>> inside a text file (one word per line) and prints them:
>>>>  def anagfind(letters): 	#find anagrams of these letters
>>>> 	fin = open('text.txt')	#one word per line file
>>>> 	wordbox = []		 #this is where the words will go
>>>> 	for line in fin:
>>>> 		word = line.strip()
>>>> 		count = 0
>>>> 		for char in letters:
>>>> 			if char not in word:
>>>> 				break
>>>> 			else:
>>>> 				count += 1
>>>> 			if count == len(word):
>>>> 				wordbox.append(word)
>>>> 	return wordbox
>>>>  Now I'd like to modify the code to naturally find all anagrams insi
> de
>>> a
>>>> wordlist.  What would be the best way to do this?  Using Hints?  Is
> it
>>> 
>>>> possible to iterate over dict keys?  How can I make a dict that maps
> 
>>> 
>>>> from a set of letters to a list of words that are spelled from those
> 
>>> 
>>>> letters?  Wouldn't I need to make the set of letters a key in a dict
> ?
>>>>  As always - Thanks for helping someone trying to learn...
>>>>  Dave
>>>> 
>>>  Suggestion: for each word, sort their characters and use them as the
> 
>>> dictionary key.  If two words have the same combination of characters
> ,
>>> then they are anagrams.  For example: "edam" and "made" are anagrams
>>> because they have the letters 'a', 'd', 'e' and 'm'.
>>>  Refer "Programming Pearls" by Jon Bentley.
>>>  --
>>> Kam-Hung Soh <a href="http://kamhungsoh.com/blog">Software Salarima
> n</
>>> a>
>> 
>> 
> 
> Your code is always going to return the same list because every word is  an
> anagram of itself.
> 
> Tip: Create a list for each dictionary key, then add a word to the list  if
> that word is not in the list.  So:
> 
> mapdic('adem') --> ["edam", "made"]
> 
> P.S. When replying, the convention is to add your response to the bottom ,
> not top of the message.
> 
> --
> Kam-Hung Soh <a href="http://kamhungsoh.com/blog">Software Salariman</ a>

I got it!  Thanks for all your help!!!  Please tell me what you think:

def anafind():
            fin = open('short.txt')			#one word per line
            mapdic = {}					#this dic maps letters to anagrams
            for line in fin:
                        line = line.strip()
                        templist = sorted(list(line))	#sort letters
                        newtlist = (''.join(templist)) 	#join letters
                        if newtlist not in mapdic:
                                    mapdic[newtlist] = [line]
                        if line not in mapdic[newtlist]:
                                    mapdic[newtlist].append(line)
            for value in mapdic.values():
                        if len(value) <= 1:
                                    pass
                        else:
                                    print value





More information about the Python-list mailing list