2016-03-01 1 views
0

Итак, мой код получает два слова и проверяет, является ли это анаграммой другого.Мой код anagram не учитывает несколько букв

Однако не работает, если несколько писем обмениваются, хотя я пытался это объяснить.

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") 

Я думаю, что это пошло куда-то не так, после раздела if len(anaw), например, если первичное слово «Hannah», а вторичное слово «hannnn», он считает, что это анаграмма.

+0

Можете ли вы объяснить логику вы пытались осуществить здесь? Также ... 'int (0)' ??? – Idos

+1

Также вы можете просто пойти 'sorted (first_word) == sorted (second_word)' и сэкономить всю эту проблему – Idos

+0

означает анаграмма, я ее отредактировал –

ответ

0
newcounter = int(0) 

Это линия, которая вызывает проблемы (в цикле while). Из-за этого вы снова начинаете проверять слово с начала. Я думаю, вы хотите, чтобы это было newcounter=letterchecker. Поскольку уже используемые символы помещаются в передней части word они игнорируются, если вы начинаете с letterchecker

Скажите мне, если он работает

Edit: Проверено с примером, приведенным, кажется, работает.

+0

уверен, что 'int (0)' вызывает у меня проблемы – mvelay

+0

Nah, та же проблема возникает –

+0

Вы изменили первый или тот, что был в цикле while? Я имел в виду один в цикле. – JeD

3

Существует гораздо более простая логика, которая может быть реализована здесь, даже без использования sorted и т. Д. Давайте предположим, что у вас есть функция 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 

Вы можете проверить это с помощью:

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

И для будущих читателей, супер простой вещий решение может быть с помощью Counter:

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

Или с использованием sorted:

>>> sorted(word1) == sorted(word2) 
+0

Вы можете использовать 'set', чтобы избежать повторной проверки похожих символов. Кроме того, я бы добавил решение 'Counter (word) == Counter (другое слово) для будущих читателей. –

+1

@ReutSharabani Я полагал, что он, возможно, не сможет импортировать/использовать 'Counter'. Что касается 'set', я могу отредактировать позже (не рядом с компьютером, поэтому я не хочу делать никаких изменений без их тестирования).Вы можете отредактировать мой ответ tho;) – Idos

+0

Я знаю, что это не так, но ответ не обязательно должен быть слишком конкретным. Если будущий читатель столкнется с этим, он может пожелать лучшего решения. Вот почему я написал «ради будущих читателей» :-) –

-2

[EDIT ЭТО ТОЛЬКО ДЛЯ палиндромов I Cant READ]

Здесь есть что-то немного более простой:

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" 
+1

Анаграммы не палиндромы. –

+1

, но палиндромы - это анаграммы :) – mvelay

+0

@ user1723662: это неправильно, 'word3 [:: - 1]' просто возвращает 'слова3' – mvelay

0

Без использования sort вы можете использовать следующий подход. Он удаляет букву из массива символов второго слова. Слова только анаграммы, если не осталось букв (и слова имеют одинаковую длину, чтобы начать и иметь длину больше, чем ноль):

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" 
+0

что означает этот символ для символа? –

+0

Это всего лишь символы в каждом слове, поэтому 'chars1' будет' ['h', 'a', 'n', 'n', 'a', 'h'] ' – Idos

+0

Он преобразует слова в массиве символов. Я изменил код, чтобы использовать 'list', выглядит немного чище. – Jaco

Смежные вопросы