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)

person vijetha    schedule 04.11.2016    source источник
comment
Похоже, вы смешиваете вкладки и пробелы для отступов - это плохая идея   -  person jonrsharpe    schedule 04.11.2016


Ответы (4)


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

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

def anagram(s1, s2):
    return sorted(s1) == sorted(s2)
person TigerhawkT3    schedule 04.11.2016

Пожалуйста, отформатируйте это в более читаемом виде. Однако похоже, что вы вызываете 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
person Steve TheGreat    schedule 04.11.2016
comment
Обратите внимание, что это по-прежнему не дает точных результатов, когда буква находится в s2, но не в s1. - person TigerhawkT3; 04.11.2016
comment
Хороший улов. Обновлен мой ответ, чтобы учесть это. - person Steve TheGreat; 04.11.2016

Вы можете попробовать это:

>>> def anagram(str1,str2):
    s1=str1.lower()
    s2=str2.lower()
    a=len(s1)
    b=len(s2)
    if a==b:
        for c in s1:
            if c in s2:
                for s in s2:
                    if s in s1:
                        return True
            else:
                return False
    else:
        return False

person Hardik Patel    schedule 16.04.2019

Вы были очень близки. Ваш отступ был плохим, но это, вероятно, связано с форматированием текста здесь, в 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 намного лучше.

person Ma0    schedule 04.11.2016
comment
У этого та же проблема, что и у ответа Стива (и алгоритма в вопросе): он выдает True, даже если s2 содержит символы, отсутствующие в s1. Попробуйте anagram('a', 'ab'). - person TigerhawkT3; 04.11.2016
comment
я сделал, и он возвращает False, как и ожидалось, поскольку set(s1) - set(s2) не является пустым набором. - person Ma0; 04.11.2016
comment
Ты уверен? Типа, действительно очень позитивно? :) - person TigerhawkT3; 04.11.2016
comment
Упс. xD Локальное, которое у меня было локально, было проверкой на равенство множества, а не на разницу пустого множества. Извините и спасибо.. - person Ma0; 04.11.2016