I Haque
I Haque

Reputation: 29

My anagram code doesn't account for multiple letters

So my code gets two words, and checks if one is the anagram of another one.

However doesn't work if multiple letters are exchanged, although I tried to account for that.

storedword = input("Enter your primary word \t")
global word 
word = list(storedword)


word3 = input("Enter anagram word \t")
word3lowercase = word3.lower()
anaw = list(word3lowercase)


counter = int(0)
letterchecker = int(0)
listlength = len(word)
newcounter = int(0)
if len(anaw) != len(word):
    print ("not anagram")

if len(anaw) == len(word):
    while counter < listlength and newcounter < listlength:
        tempcount = 0
        if anaw[counter] == word[newcounter]:
            temp = word[newcounter]
            word[newcounter] = word[tempcount]
            word[tempcount]=temp
            letterchecker +=1
            counter +=1
            tempcount +=1
            newcounter = int(0)

        else:
            newcounter +=1

if counter == len(word):
    print ("anagram")
else:
    print ("not anagram")

I think it's gone somewhere wrong after the if len(anaw) section, for example if the primary word is "hannah", and the secondary word is "hannnn", it thinks it's an anagram.

Upvotes: 0

Views: 123

Answers (4)

user1723662
user1723662

Reputation: 29

[EDIT THIS IS JUST FOR PALINDROMES I CANT READ]

Here is something a bit more simple:

storedword = input("Enter your primary word \t")
word3 = input("Enter anagram word \t")
if storedword == word3[::-1]:
    print "Is Anagram"
else:
    print "Is not anagram"

Upvotes: -2

Jan
Jan

Reputation: 1504

newcounter = int(0)

This is the line that causes the trouble (in the while loop). Because of it you start checking the word from the beginning again. I think you want it to be newcounter=letterchecker. Since already used characters are put to the front of word they are ignored if you start with letterchecker

Tell me if it works

Edit:Checked with example given, seems to work.

Upvotes: 0

Alex
Alex

Reputation: 21766

Without using sort you could use the following approach. It removes a letter from an array of a characters of the second word. The words are only anagrams if there are no letters left (and the words are the same length to start with and have a length larger than zero):

word1="hannah"
word2="nahpan"

chars1= list(word1)
chars2= list(word2)

if len(chars1)==len(chars2) and len(chars1)>0:
    for char in chars1:
        if char not in chars2:
           break
        chars2.remove(char)                   


if len(chars2)==0:
    print "Both words are anagrams"
else:
    print "Words are not anagrams"

Upvotes: 0

Idos
Idos

Reputation: 15320

There is much simpler logic that can be implemented here, even without using sorted and such. Let's assume you have a function anagram:

def anagram(word1, word2):
    if len(word1) != len(word2):
        return False

    def char_count(word):
        char_count = {}
        for c in word:
            char_count[c] = char_count.get(c, 0) + 1
        return char_count

    cr1 = char_count(word1)
    cr2 = char_count(word2)
    return cr1 == cr2

You can test this with:

>>> print(anagram("anagram", "aanragm"))
True
>>> print(anagram("anagram", "aangtfragm"))
False

And for future readers, a super simple pythonic solution might be using Counter:

from collections import Counter
>>> Counter(word1) == Counter(word2)

Or using sorted:

>>> sorted(word1) == sorted(word2)

Upvotes: 3

Related Questions