2016-11-04 2 views
0

Я написал небольшую программу, чтобы проверить, являются ли два слова анаграммами. Если два слова являются анаграммами, он должен возвращать «истину», иначе он должен возвращать «False», но я не получаю правильный вывод. Пожалуйста, скажите мне, что является ошибкой в ​​нижеприведенной программе.python Программа, чтобы проверить, являются ли два слова анаграммами

def anagram(s1,s2): 
    for x in s1: 
     if (x in s2) and (s2.count(x)==s1.count(x)): 
      pass 
     return(True) 
    else: 
     return(False) 
+3

Вы представляете собой смешение вкладок и пробелов для отступов - это [плохая идея] (https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces) – jonrsharpe

ответ

0

Просьба отформатировать это более удобочитаемым способом. Тем не менее, это выглядит, как вы вызываете return True внутри цикла, а это означает, что если какой-либо символ встречается одинаковое количество раз в каждой строке, ваша функция будет return True

Попробуйте это:

def anagram(s1,s2): 
    for x in s1: 
     if (x in s2) and (s2.count(x) == s1.count(x)): 
      pass 
     else: 
      return False 
    for x in s2: 
     if (x in s1) and (s1.count(x) == s2.count(x)): 
      pass 
     else: 
      return False 
    return True 
+1

Обратите внимание, что это по-прежнему не дает точных результатов, когда письмо находится в 's2', но не в' s1'. – TigerhawkT3

+0

Хороший улов. Обновленный мой ответ для учетной записи для этого. –

4

Вы итерация слово, а затем ничего не делает (с pass, пустой оператор). Затем вы возвращаете True безоговорочно, не оставляя никаких шансов на возврат False.

Вместо этого, вы можете просто сортировать два слова, а затем увидеть, если они в конечном итоге то же самое:

def anagram(s1, s2): 
    return sorted(s1) == sorted(s2) 
-1

Вы были очень близки. Ваш отступ был плохим, но, вероятно, из-за форматирования текста здесь в SO.

Ошибка в коде заключалась в том, что вы вернули True слишком скоро. То, что вам нужно сделать, это пройти все письма и проверить наличие и подсчет. Ниже вы можете найти исправленную и несколько оптимизированную версию того, что вы пытались сделать.

def anagram(s1, s2): 
    if set(s1) == set(s2) and all(s2.count(x) == s1.count(x) for x in set(s1)): 
     return True 
    return False 

Но опять же решение Tigerhawk стало лучше.

+0

У такой же проблемы, как и ответ Стива (и алгоритм в вопросе) - он создает 'True', даже если' s2' имеет символы, отсутствующие в 's1'. Попробуйте 'anagram ('a', 'ab')'. – TigerhawkT3

+0

Я сделал, и он возвращает False как ожидалось, так как 'set (s1) - set (s2)' не является пустым. –

+0

Вы уверены? Вроде, действительно действительно позитивный? :) – TigerhawkT3

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